UVA 10596 - Morning Walk

题目大意:给你N个结点,R条路问是否存在欧拉回路


解题思路:判断每个在路上结点是否是偶数个度数,且每个结点都指向起始结点所指向的结点

#include <cstdio>

int node[201], degree[201];

int find(int x) {
    if (x != node[x]) //假如此结点连接了其他结点, 就寻找它所连接的结点是否又连接了其他结点
        return node[x] = find(node[x]); //此联通路上面的所有结点都指向同一个端点
    return x;
}

int main() {
    int num, road;
    while (scanf("%d%d", &num, &road) != EOF) {
        bool ok = true;
        int ans = 0;
        for (int i = 0; i < num; i++) //初始化度数, 并且给结点编号
            degree[i] = 0, node[i] = i;
        int a, b;
        for (int i = 0; i < road; i++) { //记录每个结点的度数
            scanf("%d%d", &a, &b);
            node[find(a)] = find(b); // 连接两个未联通的点
            degree[a]++; 
            degree[b]++;
        }
        if (road <= 1) //小于等于 1 条路就不可能存在欧拉回路
            ok = false;
		int root = find(0);
        for (int i = 0; ok && i < num; i++) //判断所有在路上的点是否是偶数且联通
			if (degree[i] != 0)	// 如果该点在路上
				if (find(i) != root || degree[i] % 2 != 0) {	// 该点是否跟 0 点在同个集合 || 度数判断
					ok = false;
					break;
				}
		printf(ok ? "Possible\n" : "Not Possible\n");
	}
	return 0;
}


你可能感兴趣的:(UVA 10596 - Morning Walk)