hdu1878之欧拉回路

来源:互联网 发布:老挝和越南 知乎 编辑:程序博客网 时间:2024/04/28 18:22
判断是否存在欧拉回路,存在欧拉回路的条件:所有顶点的度为偶数,并且图是联通的
判断顶点的度是否为偶数只要进行统计判断就行,判断图的联通可以用并查集,判断所

有的顶点是否在一棵树上只要看有几棵树就ok了。


#include<iostream>#include<cstdio>#include<cstdlib>#include<cstring>#include<string>#include<queue>#include<algorithm>#include<map>#include<iomanip>#include<vector>#define INF 99999999using namespace std;const int MAX=1001;int n,m,father[MAX],rank[MAX];int degree[MAX],sum;void makeset(int num){for(int i=1;i<=num;++i){father[i]=i;rank[i]=1;}}int findset(int v){if(v != father[v])father[v]=findset(father[v]);return father[v];}void Union(int a,int b){int x=findset(a);int y=findset(b);if(x == y)return;if(rank[x]<rank[y]){father[x]=y;rank[y]+=rank[x];}else{father[y]=x;rank[x]+=rank[y];}--sum;}int main(){int a,b;while(cin>>n,n){cin>>m;memset(degree,0,sizeof degree);makeset(n);sum=n;for(int i=0;i<m;++i){scanf("%d%d",&a,&b);++degree[a];++degree[b];Union(a,b);}if(sum == 1){while(n){if(degree[n]&1){cout<<"0"<<endl;break;}--n;}if(!n)cout<<"1"<<endl;}else cout<<"0"<<endl;}return 0;}


原创粉丝点击