hdu1878 欧拉回路(欧拉回路+并查集)

一笔画问题

欧拉回路的思路是先判断是否连通(用并查集或dfs),其次再判断度,若为无向图,每一个顶点的度皆应为偶数;若为有向图,每一个顶点的度应为0.


#include<iostream>
#include<cstring>
using namespace std;
const int N=1001;
int pre[N];//并查集
int ans[N];//记录每个顶点的度数量
int Find(int a){
    while(pre[a]!=a)
        a=pre[a];
    return a;
}
void Union(int a,int b){
    int fa=Find(a);
    int fb=Find(b);
    pre[fa]=fb;
}
int main(){
    int n,m;
    while((cin>>n>>m)&&n){
        memset(ans,0,sizeof(ans));
        for(int i=1;i<=n;i++)
            pre[i]=i;
        for(int i=0;i<m;i++){
            int a,b;
            cin>>a>>b;
            ans[a]++;
            ans[b]++;
            Union(a,b);
        }
        int flag=1,num=0;
        for(int i=1;i<=n;i++)
            if(pre[i]==i)
                num++;
        if(num!=1)
            flag=0;
        for(int i=1;i<=n;i++)
            if(ans[i]%2==1){
                flag=0;
                break;
            }
        if(flag)
            cout<<1<<endl;
        else
            cout<<0<<endl;
    }
}

此题为无向图的一笔画问题,有向图的一笔画问题可参考hdu1116

猜你喜欢

转载自blog.csdn.net/qq_40038776/article/details/81011867