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


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值