HDU 1272 小希的迷宫并查集(判断任意2个点是否有且仅有一条路径可以相通)

xiaoxiao2021-02-28  60

Problem Description

上次Gardon的迷宫城堡小希玩了很久(见Problem B),现在她也想设计一个迷宫让Gardon来走。但是她设计迷宫的思路不一样,首先她认为所有的通道都应该是双向连通的,就是说如果有一个通道连通了房间A和B,那么既可以通过它从房间A走到房间B,也可以通过它从房间B走到房间A,为了提高难度,小希希望任意两个房间有且仅有一条路径可以相通(除非走了回头路)。小希现在把她的设计图给你,让你帮忙判断她的设计图是否符合她的设计思路。比如下面的例子,前两个是符合条件的,但是最后一个却有两种方法从5到达8。 

Input输入包含多组数据,每组数据是一个以0 0结尾的整数对列表,表示了一条通道连接的两个房间的编号。房间的编号至少为1,且不超过100000。每两组数据之间有一个空行。 整个文件以两个-1结尾。 Output对于输入的每一组数据,输出仅包括一行。如果该迷宫符合小希的思路,那么输出"Yes",否则输出"No"。 Sample Input6 8  5 3  5 2  6 45 6  0 08 1  7 3  6 2  8 9  7 57 4  7 8  7 6  0 03 8  6 8  6 45 3  5 6  5 2  0 0-1 -1 Sample OutputYesYesNo

题意:判断通过这些点相连可以达到 任意两个房间有且仅有一条路径可以相通。

思路:因为任意两个房间有且仅有一条路径可以相通,所以只可以有一个根节点,注意寻找根节点的时候的方向问题

#include <iostream> #include <cstdio> #include <cstring> #include <string> #include <algorithm> #include <map> #include <set> #include <cmath> using namespace std; typedef long long ll; const int N = 100005; int flag[N]; int parent[N]; int root(int x) { return parent[x] == x ? x: parent[x]=root(parent[x]); } void make(int x,int y) { int fx=root(x); int fy=root(y); if(fx>fy) parent[fx]=fy; else parent[fy]=fx; } int main() { int a,b; while(scanf("%d%d",&a,&b)==2){ if(a==-1&&b==-1) break; for(int i=0;i<=100000;i++) parent[i]=i; memset(flag,0,sizeof(flag)); int F=0; while(1) { if(a==0&&b==0) break; if(root(a)==root(b)) //如果2个点再次相连则错误 F=1; make(a,b); flag[a]=1; //这2个点都到达过 flag[b]=1; scanf("%d%d",&a,&b); } if(F==1) printf("No\n"); else{ int sum=0; for(int i=0;i<=100000;i++) if(flag[i]&&parent[i]==i) //记录根节点的个数 sum++; if(sum>1) printf("No\n"); else printf("Yes\n"); } } return 0; }
转载请注明原文地址: https://www.6miu.com/read-2620070.html

最新回复(0)