题目大意:给出一个迷宫,如果他是连通的且没有平行路径,输出Yes,否则输出No。
并查集纪录每个点的连通状态,对于每输入的两个点,合并他们的同时,看他们是否有相同的父亲,若有,则不符合题意。
数据输入完之后,再判断一下根结点是否唯一便可知该迷宫是否连通了。
#include <cstdio> #include <iostream> #include <cstring> using namespace std; #define MAX 100010 int par[MAX],s[MAX]; bool flag; void Init() { for(int i=1;i<MAX;i++) { par[i]=i; s[i]=0; } } int Find(int x) { while(par[x]!=x) x=par[x]; return x; } void Union(int x,int y) { x=Find(x); y=Find(y); if(x!=y) par[x]=y; else flag=false; } int main() { int a,b; while(scanf("%d%d",&a,&b)) { if(a==-1&&b==-1) break; if(a==0&&b==0) { puts("Yes"); continue; } Init(); s[a]=s[b]=1; flag=true; Union(a,b); while(scanf("%d%d",&a,&b)) { if(a==0&&b==0) break; s[a]=s[b]=1; Union(a,b); } int k=0; for(int i=1;i<MAX;i++) { if(s[i]&&par[i]==i) k++; if(k>1) { flag=false; break; } } if(flag) puts("Yes"); else puts("No"); } return 0; }