HDU-1878 欧拉回路 判定是否存在欧拉回路

题义就是在给定的图中判定是否存在欧拉回路。

图G的一个回路,若它恰通过G中每条边一次,则称该回路为欧拉(Euler)回路。
具有欧拉回路的图称为欧拉图(简称E图)。

这里总结下各种图的判定的方法:

1.无向图中:所给定的图为连通图,且所有节点的度为偶数;
2.有向图中:所给定的图为连通图,且所有节点的度为零。

代码如下:

#include <cstdlib>
#include <cstring>
#include <cstdio>
#define MAXN 1010
using namespace std;

int cnt[MAXN], set[MAXN];

int find(int x)
{
return x == set[x] ? x : set[x] = find(set[x]);
}

int main()
{
int N, M, x, y, root;
while (scanf("%d", &N), N)
{
int flag = 1, root = 0;
scanf("%d", &M);
for (int i = 0; i <= N; ++i)
set[i] = i;
memset(cnt, 0, sizeof (cnt));
while (M--)
{
scanf("%d %d", &x, &y);
int a = find(x), b = find(y);
if (a != b)
{
set[a] =b;
}
++cnt[x], ++cnt[y];
}
for (int i = 1; i <= N; ++i)
{
if (set[i] == i)
{
++root;
if (root > 1)
{
flag = 0;
break;
}
}
if (cnt[i] & 1)
{
flag = 0;
break;
}
}
printf(flag ? "1\n" : "0\n");
}
return 0;
}


 

posted @ 2012-03-10 16:19  沐阳  阅读(598)  评论(0编辑  收藏  举报