hdu1272 小希的迷宫 并查集
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1272
题目就是判断是否连通图及是否存在回路
简单的并查集
两两合并,如果存在同一个集合,则No
如果不是一个连通图 则No
否则 Yes
代码:
1 #include<iostream> 2 #include<cstdio> 3 #include<cstdlib> 4 #include<cstring> 5 using namespace std; 6 int parent[100100]; 7 bool flag; 8 int num[100100]; 9 int Find(int x) 10 { 11 int s; 12 for(s=x;parent[s]>=0;s=parent[s]); 13 return s; 14 } 15 void Union(int r1,int r2) 16 { 17 if(flag) return ; 18 int R1=Find(r1); 19 int R2=Find(r2); 20 if(R1!=R2) { 21 parent[R1]=R2; 22 return ; 23 } 24 if(R1==R2) 25 flag=1; 26 27 28 } 29 int main() 30 { 31 int u,v; 32 int tol; 33 int block; 34 while(scanf("%d%d",&u,&v)!=EOF) 35 { 36 flag=0; 37 block=0; 38 memset(parent,-1,sizeof(parent)); 39 memset(num,0,sizeof(num)); 40 if(u==-1 && v==-1 ) break; 41 if(u==0 && v==0) 42 { 43 cout<<"Yes"<<endl; 44 continue; 45 } 46 Union(u,v); 47 num[u]++; 48 num[v]++; 49 while(scanf("%d%d",&u,&v)!=EOF) 50 { 51 if(u==0 && v==0) break; 52 Union(u,v); 53 num[u]++; 54 num[v]++; 55 } 56 for(int i=1;i<=100000;i++) 57 if(parent[i]==-1 && num[i]>0) block++; 58 if(block>1) 59 cout<<"No"<<endl; 60 else 61 if(flag) cout<<"No"<<endl; 62 else 63 cout<<"Yes"<<endl; 64 } 65 return 0; 66 }