1 #include<stdio.h> 2 int map[100005],aggregate[100005]; 3 int father(int x) 4 { 5 while(x!=aggregate[x]) 6 { 7 x=father(aggregate[x]); 8 } 9 return x; 10 } 11 int main() 12 { 13 int i,j,k,l,n,m,x,y,a,b; 14 for(i=0;i<100001;i++) 15 { 16 map[i]=0; 17 aggregate[i]=i; 18 } 19 k=0; 20 while(scanf("%d%d",&a,&b)!=EOF) 21 { 22 if((a==0)&&(b==0)) 23 { 24 l=0; 25 for(i=1;i<100001;i++) 26 { 27 if((l==0)&&(map[i]==1)) 28 { 29 l=aggregate[i]; 30 break; 31 } 32 } 33 for(i=i;i<100001;i++) 34 { 35 if((map[i]==1)&&(father(i)!=l)) 36 { 37 k=1; 38 break; 39 } 40 } 41 //判断是否所有点根节点都相同,相同说明所有点都联通。 42 if(k==0) printf("Yes "); 43 if(k==1) printf("No "); 44 for(i=0;i<100001;i++) 45 { 46 map[i]=0; 47 aggregate[i]=i; 48 } 49 k=0; 50 //清零。 51 } 52 if(k==1) continue;//此时k=1且a!=0,b!=0,那么不用判断a,b是够联通,之前已经有点相互联通了,迷宫已经是不符合条件的状态了。 53 if((a==-1)&&(b==-1)) break;//结束程序 54 if((a!=0)&&(b!=0)) 55 { 56 if(map[a]==0) map[a]=1; 57 if(map[b]==0) map[b]=1; 58 //如果a,b第一次出现则标记为已出现。 59 x=father(a); 60 y=father(b); 61 //找a,b根节点的函数。 62 if(x==y) 63 { 64 k=1; 65 }//x==y的情况a,b联通。 66 else 67 { 68 if(x<y) aggregate[y]=x; 69 else aggregate[x]=y; 70 }//不连通则合并两个集合 71 } 72 } 73 }