HDU1272---(并查集)简单应用
2017-03-20 20:01
281 查看
http://acm.hdu.edu.cn/showproblem.php?pid=1272
小希的迷宫
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 48102 Accepted Submission(s): 14966
Input 输入包含多组数据,每组数据是一个以0 0结尾的整数对列表,表示了一条通道连接的两个房间的编号。房间的编号至少为1,且不超过100000。每两组数据之间有一个空行。
整个文件以两个-1结尾。
Output 对于输入的每一组数据,输出仅包括一行。如果该迷宫符合小希的思路,那么输出"Yes",否则输出"No"。
Sample Input 6 8 5 3 5 2 6 4 5 6 0 0 8 1 7 3 6 2 8 9 7 5 7 4 7 8 7 6 0 0 3 8 6 8 6 4 5 3 5 6 5 2 0 0 -1 -1 Sample Output Yes Yes No
分析:
若要输出Yes,最终必构成一棵树,即有且仅有根节点一个.
#include "cstdio" #include "cstring" #include "set" using namespace std; const int N=100000+5; int fa ; ///路径压缩 int findFa(int x) { ///return fa[x]==-1?x:fa[x]=findFa(fa[x]); 递归寻找根节点 int a=x; while(fa[x]!=-1) x=fa[x]; while(fa[a]!=-1) { int z=a; a=fa[a]; fa[z]=x; } return x; } bool Bind(int x,int y) { int faA=findFa(x); int faB=findFa(y); if(faA!=faB) { fa[faA]=faB; return true; } return false; } int main() { int x,y; while(scanf("%d%d",&x,&y)==2&&x!=-1) { if(x==0&&y==0) { printf("Yes\n");continue; } memset(fa,-1,sizeof(fa));///!!! set<int> s;///存储出现过的点X_X bool ok=true;///表示当前迷宫是否合法,Ok巧妙用法,逻辑清楚 do{ if(!Bind(x,y)) ok=false; s.insert(x);s.insert(y); }while(scanf("%d%d",&x,&y)==2&&x); if(ok){ int cnt=0;///连通分量数目 for(set<int>::iterator it=s.begin();it!=s.end();it++) { if(*it==findFa(*it)) cnt++; } if(cnt>1)ok=false; } printf("%s\n",ok?"Yes":"No"); } return 0; }
相关文章推荐
- HDU - 1272 小希的迷宫之独木桥(并查集的简单应用)
- hdu 1213 How Many Tables(并查集的简单应用)
- HDU 2818&&POJ 1988 并查集简单应用
- hdu1272小希的迷宫 (并查集应用)
- 畅通工程 HDU - 1232--并查集简单应用
- hdu 1272 并查集简单题目
- hdu 3038 How Many Answers Are Wrong【并查集的简单应用】
- HDU 2818&&POJ 1988 并查集简单应用
- HDU--1232 -- 畅通工程 [并查集最简单应用]
- hdu 3038 How Many Answers Are Wrong【并查集的简单应用】
- HDU 1272小希的迷宫(简单并查集)
- HDU - 1272 小希的迷宫(简单并查集)
- hdoj 1272 小希的迷宫 又一个并查集的简单应用
- HDU 1272 小希的迷宫 (简单并查集)
- 并查集的简单应用——HDU
- HDU 1232 畅通工程 并查集简单应用
- 并查集总结【模板】 例题:①简单POJ - 1611 The Suspects ②一般HDU - 1272 小希的迷宫
- hdu 1272 小希的迷宫(简单并查集)
- hdu 1272 小希的迷宫 【并查集】
- HDU 1263 水果(map的简单应用)