
6 8 5 3 5 2 6 4 5 6 0 0 8 1 7 3 6 2 8 9 7 5 7 4 7 8 7 6 0 0 3 8 6 8 6 4 5 3 5 6 5 2 0 0 -1 -1
Yes Yes No
#include"stdio.h"
#include"string.h"
#include"math.h"
#define N 100005
int pre[N],mark[N]; //mark[]数组标记出现的房间
int Find(int k) //pre[]记录数组根节点
{
while(pre[k]!=k)
k=pre[k];
return k;
}
int Max(int a,int b)
{
return a>b?a:b;
}
int main()
{
int i,n,a,b,f1,f2,cnt,flag;
while(scanf("%d%d",&a,&b),a!=-1||b!=-1)
{
flag=1;
if(a==0&&b==0)
{
printf("Yes\n");
continue;
}
memset(mark,0,sizeof(mark));
mark[a]=1;
mark[b]=1;
n=0; //记录出现的最大的房间编号
n=Max(n,Max(a,b));
for(i=1;i<N;i++)
pre[i]=i;
f1=Find(a);
f2=Find(b);
if(f1!=f2)
pre[f1]=f2;
while(scanf("%d%d",&a,&b),a||b)
{
mark[a]=1;
mark[b]=1;
n=Max(n,Max(a,b));
f1=Find(a);
f2=Find(b);
if(f1==f2)
flag=0;
if(f1!=f2)
pre[f1]=f2;
}
cnt=0;
for(i=1;i<=n;i++)
if(mark[i]&&pre[i]==i)
cnt++;
if(cnt==1&&flag)
printf("Yes\n");
else
printf("No\n");
}
return 0;
}
原文:http://blog.csdn.net/u011721440/article/details/21005451