欧拉回路 HDU - 1878

欧拉回路是指不令笔离开纸面,可画过图中每条边仅一次,且可以回到起点的一条回路。现给定一个图,问是否存在欧拉回路?

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;
}

猜你喜欢

转载自blog.csdn.net/islittlehappy/article/details/81226986