题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1272
题解:任意两个房间有且仅有一条路径可以相通,判断是否是一棵树(不存在回路)
#include <stdio.h>
#include <string.h>
#define MAXN 100002
int father[MAXN],flag[MAXN],sig;
int find(int x)
{
while(x!=father[x])
x=father[x];
return father[x];
}
void Union(int x,int y)
{
int fx=find(x);
int fy=find(y);
if (fx!=fy)
{
father[fx]=fy;
}
else
sig=1;//如果有共同的根节点,存在回路
}
int main()
{
int x,y,i,ans;
while(scanf("%d %d",&x,&y)&&((x+y)!=-2))
{
ans=0;
sig=0;
if(x+y==0)//空树
{
printf("Yes\n");
continue;
}
for(i=0;i<MAXN;++i)
{
father[i]=i;
flag[i]=0;
}
Union(x,y);
flag[x]=flag[y]=1;
while(scanf("%d %d",&x,&y))
{
if(x+y==0)
break;
Union(x,y);
flag[x]=1;
flag[y]=1;
}
if(sig==1)
{
printf("No\n");
continue;
}
for(i=1;i<MAXN;++i)
{
if(flag[i]&&father[i]==i)
ans++;
}
if(ans>1)
printf("No\n");
else
printf("Yes\n");
}
return 0;
}