您的位置:首页 > 其它

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

2012-03-10 16:19 253 查看
题义就是在给定的图中判定是否存在欧拉回路。

图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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: