NWU_ACM

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理
 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 }
View Code

 

posted on 2017-04-02 19:22  NWU_ACM  阅读(76)  评论(0编辑  收藏  举报