题目:并查集求最小环
分析
除了维护祖先,同时还要维护距离。
代码
#include <cstdio>
#include <cctype>
using namespace std;
int n,f[200001],dis[200001],min;
int in(){
int ans=0; char c=getchar();
while (!isdigit(c)) c=getchar();
while (isdigit(c)) ans=ans*10+c-48,c=getchar();
return ans;
}
int getf(int u){
if (f[u]==u) return u; int ft=f[u];
f[u]=getf(f[u]); dis[u]+=dis[ft];
return f[u];
}
void check(int x,int y){
int fa=getf(x),fb=getf(y);
if (fa!=fb) f[fa]=fb,dis[x]=dis[y]+1;//没有传递
else min=(min<dis[x]+dis[y]+1)?min:dis[x]+dis[y]+1;//收到传递信息
}
int main(){
n=in(); min=2147483647;
for (int i=1;i<=n;i++) f[i]=i;
for (int i=1;i<=n;i++) check(i,in());
return !printf("%d",min);
}
本文介绍了一种使用并查集解决最小环问题的方法。在维护祖先信息的同时,还记录了节点间的距离,以实现对环中边数的计算。通过具体代码实现展示了如何检查并更新节点间的连接关系及最小环的长度。

被折叠的 条评论
为什么被折叠?



