题目:并查集求最小环
分析
除了维护祖先,同时还要维护距离。
代码
#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);
}