迷宫中不能有回路,还要连通
如果最后集合数是一个那就是连通,否则不联通
要合并的两个顶点在相同集合内,表示出现了回路
输入时注意一下
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 }
原文地址:https://www.cnblogs.com/fqfzs/p/9991546.html
时间: 2024-10-16 14:32:23