题目分析: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;
}