HDU - 1272 小希的迷宫 --并查集
作者:互联网
题目链接:
http://acm.hdu.edu.cn/showproblem.php?pid=1272
题目思路:
小希希望只有一条路径相通,所有路径都是无向的。只要两个节点在并查集里是同一个父亲,说明它们已经存在路径。如果再次出现路径,就说明已经不符合要求。
要注意的是:必须保证迷宫是连通的。
代码:
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #define maxn 100005 5 using namespace std; 6 int fa[maxn]; 7 int flag=1; 8 int findroot(int x) 9 { 10 if(fa[x]==x) 11 return x; 12 else 13 return fa[x]=findroot(fa[x]); 14 } 15 void marage(int a,int b) 16 { 17 a=findroot(a); 18 b=findroot(b); 19 if(a==b) 20 { 21 flag=0; 22 } 23 fa[a]=b; 24 } 25 int main() 26 { 27 int kk=0; 28 int vis[maxn]; //标记数组,记录该节点是否出现过 29 while(1) 30 { 31 flag=1; 32 int x; 33 int y; 34 for(int i=1;i<maxn;i++) 35 fa[i]=i; 36 memset(vis,0,sizeof(vis)); 37 while(scanf("%d%d",&x,&y)) 38 { 39 if(x==0&&y==0) 40 break; 41 if(x==-1&&y==-1) 42 return 0; 43 marage(x,y); 44 vis[x]=vis[y]=1; 45 } 46 int sum=0; 47 for(int i=1;i<maxn;i++) 48 if(vis[i]&&fa[i]==i) //统计父亲个数目 49 sum++; 50 if(sum>1) //如果父亲个数不是1,说明它们不连通 51 flag=0; 52 if(flag) 53 cout<<"Yes"<<endl; 54 else 55 cout<<"No"<<endl; 56 } 57 }
标签:HDU,小希,int,查集,fa,flag,maxn,findroot,include 来源: https://www.cnblogs.com/blame/p/11307518.html