hdu 1272 小希的迷宫(并查集)

题目分析:1.每两点之间有且仅有一条路径,有路径,要保证只有一个父亲结点(即所有的房间都只指向一个房间),

           仅有一条,在合并两个房间时,他们的父亲结点要不一样,如果一样说明有回路

                 2.直接输入0 0时,要输出Yes,用vc2008是程序有未知错误,用vc6.0加一个判断条件就过了

代码:

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int set[100100];
int vis[100100];
int find(int x)
{
	int i;
	for(i=x;i!=set[i];i=set[i]);
	while(x!=i)//压缩路径
	{
		int temp=set[x];
		set[x]=i;
		x=temp;
	}
	return i;
}
int main()
{
	int x,y,num=0,i;
	bool flag=true;
	for(i=1;i<=100000;i++)
		   set[i]=i;
	memset(vis,0,sizeof(vis));
	while(scanf("%d %d",&x,&y)!=EOF)
	{
       if(x+y==-2)
		   break;
       if(x+y==0)
	   {
		   for(i=1;i<=100000;i++)
		   {
			   if(vis[i]!=0 && set[i]==i)
				   num++;
		   }
		  /* if(flag==true && num==1)//确保只有一条路径,并且所有的都联通
		   {
			   printf("Yes\n");
		   }*/
		   if(flag==true)
		   {
			   if(num==1||num==0)//注意这
				   printf("Yes\n");
			   else
				   printf("No\n");
		   }
		   else
		   {
			   printf("No\n");
			  // printf("num=%d*****\n",num);
		   }
		   flag=true;
		   num=0;
		   for(i=1;i<=100000;i++)//初始化
		       set[i]=i;
		   memset(vis,0,sizeof(vis));
	   }
	   else
	   {
		   vis[x]=1;
		   vis[y]=1;

		   int fx=find(x);
		   int fy=find(y);
		   if(fx==fy)//有回路
			   flag=false;
		   else if(fx<fy)
		   {
			   //set[y]=fx;
               set[fy]=fx;
 		   }
		   else
		   {
			  //set[x]=fy;
			   set[fy]=fx;
		   }
	   }
	   
	}
	//system("pause");
	return 0;
}


你可能感兴趣的:(hdu 1272 小希的迷宫(并查集))