您的位置:首页 > 其它

[USACO]EulerianTour (欧拉通路)

2014-04-05 11:39 405 查看
题意:求序列最短的欧拉通路

解题思路: 无向图欧拉通路存在的条件是每个点的度都是偶数 或者是 有两个点度为奇数(一个为起点,一个为终点) 这里需要用到 fleury 算法(判圈法)时间复杂度为 O(V+E)

解题代码:

/*
ID: dream.y1
PROG: fence
LANG: C++
*/
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<time.h>
#include<math.h>
#include<limits.h>
int hs[2000];
int map[600][600];
int n;
int be = 0;
int en = 0;
int ans[1000];
int numans = 0 ;
int okk = 0 ;
int is  = 0 ;
void dfs(int k  )
{
if(!hs[k])
{
ans[numans] = k ;
numans = numans +1;
}else {
while(hs[k])
{
for(int i = 1;i <= 500;i++)
{
if(map[k][i])
{
map[k][i] -- ;
map[i][k] -- ;
hs[i] --;
hs[k] --;
dfs(i);
}
}
}
ans[numans] = k ;
numans ++ ;

}

}
int main(){

freopen("fence.in","r",stdin);
freopen("fence.out","w",stdout);
memset(map,0,sizeof(map));
memset(hs,0,sizeof(hs));
scanf("%d",&n);
for(int i = 1;i  <= n;i ++)
{
int a, b;
scanf("%d %d",&a,&b);
map[a][b] ++ ;
map[b][a] ++ ;
hs[a] ++ ;
hs[b] ++ ;
}
int ok = 0 ;
int bbe = INT_MAX ;
for(int i = 1;i <= 500;i ++)
{
if(hs[i] % 2== 1)
{
is = 1;

be = i ;
ok = 1;
break;
}
else if(hs[i])
{
bbe = bbe > i ? i:bbe;
}
}
if(ok ) dfs(be);
if(!ok)
dfs(bbe);
for(int i = numans -1 ;i  >= 0 ; i --)
printf("%d\n",ans[i]);
return 0 ;
}


View Code
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: