欧拉回路是指不令笔离开纸面,可画过图中每条边仅一次,且可以回到起点的一条回路。现给定一个图,问是否存在欧拉回路?
Input
测试输入包含若干测试用例。每个测试用例的第1行给出两个正整数,分别是节点数N ( 1 < N < 1000 )和边数M;随后的M行对应M条边,每行给出一对正整数,分别是该条边直接连通的两个节点的编号(节点从1到N编号)。当N为0时输入结
束。
Output
每个测试用例的输出占一行,若欧拉回路存在则输出1,否则输出0。
Sample Input
3 3 1 2 1 3 2 3 3 2 1 2 2 3 0
Sample Output
1 0
思路:
图是连通图,用并查集判断连通图
图中含有欧拉回路的充分必要条件是含有所有顶点的度数为偶数
#include<cstdio>
#include<cstring>
#include<vector>
#include<algorithm>
using namespace std;
const int N = 1005;
vector<int>G[N];
int Deg[N],per[N];
int n,m;
void init(){
for(int i=0;i<=n;i++)
per[i]=i;
}
int Find(int x){
return x==per[x]?x:(per[x]=Find(per[x]));
}
void mix(int a,int b){
int fa=Find(a),fb=Find(b);
if(fa!=fb) per[fa]=fb;
}
int judge(){
int ans=0;
for(int i=1;i<=n;i++)
if(i==Find(i)) ans++;
return ans==1;
}
int main(){
while(~scanf("%d",&n)&&n){
scanf("%d",&m);
init();
memset(Deg,0,sizeof(Deg));
for(int i=0;i<m;i++){
int u,v;
scanf("%d%d",&u,&v);
mix(u,v);
Deg[u]++;
Deg[v]++;
}
int flag=1;
for(int i=1;i<=n;i++)
if(Deg[i]%2==1||!Deg[i]){
flag=0;
break;
}
if(!flag) printf("%d\n",flag);
else printf("%d\n",judge());
}
return 0;
}