#并查集#codevs 4511 洛谷 2661 jzoj 4324 信息传递

题目:并查集求最小环


分析

除了维护祖先,同时还要维护距离。


代码

#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);
}

猜你喜欢

转载自blog.csdn.net/sugar_free_mint/article/details/81103693