HDU 1272 小希的迷宫【并查集】
2014-08-08 15:24
49 查看
/*
题目大意:
解题思路:
难点详解:
关键点:并查集和成环
解题人:lingnichong
解题时间:2014/08/08 15:26 2015.04.04 11:25重写
解题感受:还是没理解并查集的运用
现在有些新的认识了,但还没理解透,刚开始对输入输出不知道咋弄,今天早上灵机一动,静下心来慢慢写出来了,但对判断还不是很了解,遇到其他题还是睁眼瞎
*/
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 26295 Accepted Submission(s): 8106
Problem Description
上次Gardon的迷宫城堡小希玩了很久(见Problem B),现在她也想设计一个迷宫让Gardon来走。但是她设计迷宫的思路不一样,首先她认为所有的通道都应该是双向连通的,就是说如果有一个通道连通了房间A和B,那么既可以通过它从房间A走到房间B,也可以通过它从房间B走到房间A,为了提高难度,小希希望任意两个房间有且仅有一条路径可以相通(除非走了回头路)。小希现在把她的设计图给你,让你帮忙判断她的设计图是否符合她的设计思路。比如下面的例子,前两个是符合条件的,但是最后一个却有两种方法从5到达8。
Input
输入包含多组数据,每组数据是一个以0 0结尾的整数对列表,表示了一条通道连接的两个房间的编号。房间的编号至少为1,且不超过100000。每两组数据之间有一个空行。
整个文件以两个-1结尾。
Output
对于输入的每一组数据,输出仅包括一行。如果该迷宫符合小希的思路,那么输出"Yes",否则输出"No"。
Sample Input
Sample Output
2015.04.04最新代码
2014/08/08 15:26
题目大意:
解题思路:
难点详解:
关键点:并查集和成环
解题人:lingnichong
解题时间:2014/08/08 15:26 2015.04.04 11:25重写
解题感受:还是没理解并查集的运用
现在有些新的认识了,但还没理解透,刚开始对输入输出不知道咋弄,今天早上灵机一动,静下心来慢慢写出来了,但对判断还不是很了解,遇到其他题还是睁眼瞎
*/
小希的迷宫
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 26295 Accepted Submission(s): 8106
Problem Description
上次Gardon的迷宫城堡小希玩了很久(见Problem B),现在她也想设计一个迷宫让Gardon来走。但是她设计迷宫的思路不一样,首先她认为所有的通道都应该是双向连通的,就是说如果有一个通道连通了房间A和B,那么既可以通过它从房间A走到房间B,也可以通过它从房间B走到房间A,为了提高难度,小希希望任意两个房间有且仅有一条路径可以相通(除非走了回头路)。小希现在把她的设计图给你,让你帮忙判断她的设计图是否符合她的设计思路。比如下面的例子,前两个是符合条件的,但是最后一个却有两种方法从5到达8。
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
2015.04.04最新代码
#include<stdio.h> #include<string.h> #define MAXN 100000+10 int father[MAXN],flag; bool vis[MAXN]; void build() { int i; for(i = 0; i < MAXN; i++) father[i] = i; } /******************************/ int find(int x) { return x==father[x]?x:x=find(father[x]); } void join(int x,int y) { x=find(x); y=find(y); if(x != y) father[x]=y; else flag=1; } /*******************************/ void liantong() { int i,sum=0; for(i=1;i<MAXN;i++) { if(!vis[i]&&father[i]==i) sum++; if(sum>1) { flag=1; break; } } } int main() { int n,m,x,y; int i; while(scanf("%d%d",&n,&m)) { if(n==-1&&m==-1) break; if(n==0&&m==0) { printf("Yes\n"); continue; } memset(vis,true,sizeof(vis)); build(); flag=0; join(n,m); vis =vis[m]=false; while(scanf("%d%d",&n,&m)) { if(n==0&&m==0) break; join(n,m); vis =vis[m]=false; } liantong(); if(flag==0) printf("Yes\n"); else printf("No\n"); } return 0; }
2014/08/08 15:26
#include<stdio.h> #include<string.h> #define MAXN 100000+10 int father[MAXN],arr[MAXN]; int find(int x)//找出根 { return x==father[x]?x:x=find(father[x]); } int main() { int m,n,x,y,temp; int i; while(1)//控制输入的 { temp=1; memset(arr,0,sizeof(arr)); scanf("%d%d", &m,&n); if(m==-1 && n==-1) break; else if(m==0 && n==0)//一开始是一个点也可以是一个迷宫 printf("Yes\n"); else { for(i = 1; i < MAXN; i++) { father[i]=i; } arr[m]=arr =1; x=find(m); y=find(n); if(x != y) father[x]=y; else//如果根一样,在一条直线的两点看来是构成回路的 { printf("No\n"); continue; } } while(1)//控制结尾 { scanf("%d%d", &m, &n); if(m==0 && n==0) break; arr[m]=arr =1; x=find(m); y=find(n); if(x != y) father[x]=y; else temp=0; } int count=0;//不管是否成环,图不连通,输出No for(i = 0; i < MAXN; i++) if(arr[i] && father[i] == i) count++; if(count > 1) temp=0; if(temp) printf("Yes\n"); else printf("No\n"); } return 0; }
相关文章推荐
- ACM-并查集之小希的迷宫——hdu1272
- hdu1272 小希的迷宫 并查集
- [HDU1272]小希的迷宫[并查集]
- HDU 1272 小希的迷宫(并查集)
- HDU-1272-小希的迷宫 [并查集]
- 杭电 hdu 1272 小希的迷宫 和 hdu 1325 Is It A Tree?(最下生成树 + 并查集)
- HDOJ 1272 小希的迷宫 (并查集实现 及 Tarjan实现)
- HDU 1272 小希的迷宫 并查集判断回路和连通
- HDU 1272小希的迷宫 并查集
- hdu 小希的迷宫(并查集)(连通无环图)
- 并查集 小希的迷宫http://acm.hdu.edu.cn/showproblem.php?pid=1272
- 并查集基础-----HDOJ1272-----小希的迷宫
- hdoj--1272--小希的迷宫(并查集)
- HDOJ 题目1272 小希的迷宫(并查集)
- HDU-1272 小希的迷宫 (并查集)
- HDU 1272 小希的迷宫(并查集)
- HDU 1272 小希的迷宫 [并查集+回路判定]
- HDU 1272 小希的迷宫(并查集)
- HDU 1272 小希的迷宫 并查集 (判断任意2个点是否有且仅有一条路径可以相通)
- hdu 1272 小希的迷宫(并查集 最小生成树)