HDU--1272
题目:
小希的迷宫
原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=1272
分析:并查集的应用。判断有无环以及是否都在一个集合里即可!
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<cmath> 5 #include<algorithm> 6 #define maxn 100005 7 #define ll long long 8 #define inf 0x7fffffff 9 using namespace std; 10 int fa[maxn],vis[maxn]; 11 void make_set() 12 { 13 for(int i=0;i<maxn;i++) 14 fa[i]=i; 15 } 16 int find_fa(int x) 17 { 18 if(fa[x]==x)return x; 19 else return fa[x]=find_fa(fa[x]); 20 } 21 void Union(int x,int y) 22 { 23 fa[y]=x; 24 } 25 int main() 26 { 27 int a,b,son,ori; 28 while(scanf("%d%d",&a,&b)==2) 29 { 30 if(a==-1&&b==-1)break; 31 if(a==0&&b==0) 32 { 33 puts("Yes"); 34 continue; 35 } 36 memset(vis,0,sizeof(vis)); 37 int flag=0; 38 make_set(); 39 fa[b]=a; 40 son=b; 41 vis[a]=1;vis[b]=1; 42 while(1) 43 { 44 scanf("%d%d",&a,&b); 45 if(a==0&&b==0)break; 46 if(flag)continue; 47 int nx=find_fa(a); 48 int ny=find_fa(b); 49 if(nx==ny)flag=1; 50 else if(nx!=ny) 51 { 52 Union(nx,ny); 53 vis[a]=1;vis[b]=1; 54 } 55 } 56 if(!flag) 57 { 58 ori=find_fa(son); 59 for(int i=0;i<maxn;i++) 60 if(vis[i]) 61 { 62 if(find_fa(i)!=ori) 63 { 64 flag=1;break; 65 } 66 } 67 } 68 if(flag)printf("No\n"); 69 else printf("Yes\n"); 70 } 71 return 0; 72 }