题义就是在给定的图中判定是否存在欧拉回路。
图G的一个回路,若它恰通过G中每条边一次,则称该回路为欧拉(Euler)回路。
具有欧拉回路的图称为欧拉图(简称E图)。这里总结下各种图的判定的方法:
1.无向图中:所给定的图为连通图,且所有节点的度为偶数;
2.有向图中:所给定的图为连通图,且所有节点的度为零。代码如下:
#include#include #include #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; }