题解
2024-03-24 11:54:20
发布于:广东
9阅读
0回复
0点赞
#include<bits/stdc++.h>
using namespace std;
int ans_min=9999999;
int n,a[1000001];
int dis[1000001];//记录到目前的根节点的距离
int find(int x){
//a[1]=1;
if(a[x]!=x){
int last=a[x];
a[x]=find(a[x]);
dis[x]+=dis[last];
}
return a[x];
}
void merge(int x,int y){
int xx=find(x);
int yy=find(y);
if(xx!=yy){
a[xx]=yy;
dis[x]=dis[y]+1;
}
else ans_min=min(ans_min,dis[x]+dis[y]+1);
}
int main(){
cin>>n;
//第一步每个集合都是独立的
for(int i=1;i<=n;i++) a[i]=i;
//合并
for(int i=1;i<=n;i++){
int t;
cin>>t;
merge(i,t);
}
cout<<ans_min;
return 0;
}
这里空空如也
有帮助,赞一个