题义就是在给定的图中判定是否存在欧拉回路。
图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;
}