hdu 1272 小希的迷宫

点击打开链接

给你多组n和m,表示,n和m联通,判断是否存在回路,若存在,输出Yes,否则为No

成回路时,输入的两个有共同的根节点。

只连通时,根节点为1,

#include"stdio.h"
int set[100005],visit[100005],flag;
int find(int x)
{
	int i,r;
	while(set[r]!=r)
		r=set[r];
	while(r!=set[x])
	{
		i=set[x];
		set[x]=r;
		x=i;
	}
	return r;
}
void merge(int x,int y)
{
	int fx,fy;
	fx=find(x);
	fy=find(y);
	if(fx<fy)set[fy]=fx;
	else if(fy<fx)set[fx]=fy;
	else flag=0;
}
int main()
{
	int i,n,m,cnt;
	while(scanf("%d%d",&n,&m)!=EOF)
	{
		if(n==0&&m==0)
		{
			printf("Yes\n");continue;
		}
		if(n==-1&&m==-1) break;
		for(i=1;i<=100000;i++)
		{
			set[i]=i;
			visit[i]=0;
		}
		flag=1;
		visit[n]=visit[m]=1;
		merge(n,m);
		while(scanf("%d%d",&n,&m)!=EOF&&n!=0)
		{
			merge(n,m);
			visit[n]=visit[m]=1;
		}
		cnt=0;
		for(i=1;i<=100000;i++)
		{
			if(visit[i]&&set[i]==i)
				cnt++;
			if(cnt>1) flag=0;
		}
		if(flag)
			printf("Yes\n");
		else printf("No\n");
	}
	return 0;
}


posted on 2012-07-26 15:03  Slege  阅读(107)  评论(0编辑  收藏  举报

导航