1. 程式人生 > >hdu1272小希的迷宮(並查集判斷回路和是否連通)

hdu1272小希的迷宮(並查集判斷回路和是否連通)

show set onclick spa 分享 return print 聯通 兩個

傳送門

迷宮中不能有回路,還要連通

如果最後集合數是一個那就是連通,否則不聯通

要合並的兩個頂點在相同集合內,表示出現了回路

輸入時註意一下

技術分享圖片
 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

hdu1272小希的迷宮(並查集判斷回路和是否連通)