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\n");
43 if(k==1) printf("No\n");
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 }