小希的迷宫——并查集入门
题意:
给定一个无向图,判断该图是否满足:任意两点有且仅有一条路径。
题解:
用并查集判断是否有且仅有一个根节点即可
首先如果在并查集维护的过程中遇到两点已经在同一个根节点下,那么就不满足只有一条路径,如果并查集维护完成,发现根节点个数>1那么也不满足
因为输入是不定向输入,所以用数组标记输入,for循环来判断是否 f【i】== i
代码:
#include<iostream> #include<stdio.h> #include<math.h> #include<cstring> #include<map> using namespace std; typedef long long ll; const int maxn=1e5+5; int f[maxn],vis[maxn]; int flag=1; int Find(int x) { return x==f[x]?x:f[x]=Find(f[x]); } void join(int x,int y) { int fx=Find(x); int fy=Find(y); if(fx!=fy) { f[fx]=fy; return ; } flag=0; } int main() { int a,b; while(~scanf("%d%d",&a,&b)) { if(a==-1 && b==-1)break; if(a==0 && b==0){printf("Yes\n");continue;} for(int i=0;i<maxn;i++)f[i]=i,vis[i]=0; join(a,b); vis[a]=1; vis[b]=1; while(~scanf("%d%d",&a,&b) && (a || b)) { join(a,b); vis[a]=1; vis[b]=1; } if(!flag){printf("No\n");continue;} int cnt=0; for(int i=0;i<maxn;i++) { if(vis[i] && f[i]==i)cnt++; } if(cnt==1)printf("Yes\n"); else printf("No\n"); } return 0; }

浙公网安备 33010602011771号