hdu1272小希的迷宮(並查集判斷回路和是否連通)
阿新 • • 發佈:2018-11-20
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 }View Code13 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 }
hdu1272小希的迷宮(並查集判斷回路和是否連通)