hdu1272小希的迷宫(并查集判断回路和是否连通)

传送门

迷宫中不能有回路,还要连通

如果最后集合数是一个那就是连通,否则不联通

要合并的两个顶点在相同集合内,表示出现了回路

输入时注意一下

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 int f[100005];
 4 int getf(int v)
 5 {
 6     if(f[v]==v)return v;
 7     else
 8     {
 9         f[v]=getf(f[v]);
10         return f[v];
11     }
12 }
13 void merge(int v,int u)
14 {
15     int t1,t2;
16     t1=getf(v);
17     t2=getf(u);
18     if(t1!=t2)
19     {
20         f[t2]=t1;
21         
22     }
23     return;
24 }
25 void init()
26 {
27     for(int i=1; i<100005; i++)
28     {
29         f[i]=i;
30     }
31 }
32 int data[100005];
33 int main()
34 {
35     int x,y,num=0,maxx=-1,ans=0,flag=0;
36     memset(data,0,sizeof(data));
37     init();
38     while(scanf("%d %d",&x,&y))
39     {
40         if(x==-1&&y==-1)break;
41         if(x!=0&&y!=0)
42         {
43             if(getf(x)==getf(y))flag=1;
44             data[x]=x;
45             data[y]=y;
46             merge(x,y);
47             //int temp=x>y?x:y;
48         //    maxx=maxx>temp?maxx:temp;
49         }
50         if(x==0&&y==0)
51         {
52             for(int i=1; i<=100005; i++)
53             {
54                 if(data[i])
55                 {
56                     if(getf(i)==i)ans++;
57                 }
58             }
59             if(flag||ans>1)
60             {
61                 printf("No\n");
62             }
63             else
64             {
65                 printf("Yes\n");
66             }
67             num=0,maxx=-1,ans=0,flag=0;
68             memset(data,0,sizeof(data));
69             init();
70         }
71     }
72     return 0;
73 }
View Code

 

posted @ 2018-11-20 20:58  柠檬加糖  阅读(284)  评论(0编辑  收藏  举报