传送门:HDU 1272
题意:给一个迷宫,如果任意两个房间只有一条路,输出Yes,如果有多条路,则输出No。
题解:并查集。判断为Yes的条件:1.该图为无环图。2.只有一个集合
代码:
#include <iostream>
#include <cstdio>
#include <cstring>
#define MAX 100005
using namespace std;
int father[MAX];
int temp[MAX];
int Find(int x)
{
return x==father[x]?x:Find(father[x]);
}
int main()
{
int x,y,i,flag,Count;
while(scanf("%d%d",&x,&y))
{
if(x==-1&&y==-1) break;
for(i=1;i<100005;i++) father[i]=i;
memset(temp,0,sizeof(temp));
flag=1;i=1;
if(x==0&&y==0) printf("Yes\n");
else
{
while(x!=0&&y!=0)
{
temp[x]=temp[y]=1;
int xx=Find(x);
int yy=Find(y);
if(xx==yy) flag=0;//有环
father[xx]=yy;
scanf("%d%d",&x,&y);
}
for(i=1,Count=0;i<MAX;i++)
{
if(temp[i]&&father[i]==i)
Count++;
if(Count>1) flag=0;
}
if(flag==1) printf("Yes\n");
else printf("No\n");
}
}
return 0;
}