UVA 10596 - Morning Walk

来源:互联网 发布:隐形眼镜掉在地上 知乎 编辑:程序博客网 时间:2024/05/21 13:58

题目大意:给你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;}


0 0
原创粉丝点击