杭电1878--欧拉回路

以前还以为自己当时做的那个"一笔画问题"有问题, 做了这个题之后才发现当时水到没边了。  纯欧拉回路(所有节点入度均为偶数)。

#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
const int N = 1001;
int n, M, father[N], degree[N];
void init()
{
    for(int i = 1; i <= n; i++)
        father[i] = i;
} 
int Find(int a)
{
    if(a == father[a])
        return a;
    else
        return father[a] = Find(father[a]);
}
void Mercy(int a,int b)
{
    int Q = Find(a);
    int P = Find(b);
    if(Q != P)
        father[Q] = P;    
}
int main()
{
    while(~scanf("%d", &n), n)
    { 
        init();
        scanf("%d", &M);
        memset(degree, 0, sizeof(degree)); 
        for(int i = 0; i < M; i++)
        {
            int a, b;
            scanf("%d%d", &a, &b);
            Mercy(a, b);
            degree[a]++;
            degree[b]++;
        }
        int TotAl = 0;  bool flag = true; 
        for(int i = 1; i <= n; i++)
        {
            if(i == father[i])
                TotAl++;
            if(degree[i] & 1)
                flag = false;
        }
        if(flag == false || TotAl != 1)
            printf("0
");
        else
            printf("1
"); 
    }
    return 0;    
} 
原文地址:https://www.cnblogs.com/soTired/p/4847408.html