欧拉回路的判断(hdu1878)其一

输入若干测试用例,判定一个无向图是否有欧拉回路。
此题是无向图,无向图的欧拉回路需要满足两个条件,一是图是连通的,二是各个结点度数为偶数。
程序中用并查集判定图是否连通,然后构造一个并查集,如果连通则其根相同,用数组b[]统计各个结点的连通度。

#include <string.h>
#include <stdio.h>
int f[1100],b[1100];
int find(int u)
{
	if (f[u]!=u)
		f[u]=find(f[u]);
	return f[u];
}
void merge(int u,int v)
{
	int t1=find(u),t2=find(v);
	if (t1!=t2)
		f[t2]=t1;
}
int main()
{
	int n,m,i,j,x,y;
	while(~scanf("%d",&n)&&n)
	{
		scanf("%d",&m);
		for (i=0; i<=1000; i++)
			f[i]=i;
		memset(b,0,sizeof(b));

		for (i=0; i<m; i++)
		{
			scanf("%d%d",&x,&y);
			b[x]++,b[y]++;
			merge(x,y);
		}
		int s=0,flag=0;
		for (i=1; i<=n; i++)
		{
		//	printf("<%d %d %d\n",i,f[i],b[i]);
			if (f[i]==i)
				s++;//如果有多个根节点,则不符合
			if (b[i]%2!=0)
				flag=1;//节点入度为偶数
		}
		if (s==1&&flag==0)
		printf("1\n");
		else
		printf("0\n");
	
	}
	return 0;
}
posted @ 2020-09-27 11:03  索饮  阅读(144)  评论(0编辑  收藏  举报