4.12总结
T1 P2661 [NOIP 2015 提高组] 信息传递
首先分析给出的图片
显而易见,给出的关系是被告诉的人是告诉人的父亲,那么可以得到这样一张图:

可以发现,最终的答案就是图中环的大小,同时可能有多个环,要找最小的一个
那怎么判环?可以使用并查集
按照这个标记方法,能看出当一个点的父亲的祖先是他自己时,就会出现环。
大小就是找祖先的次数
代码:
点击查看代码
#include<bits/stdc++.h>
#define int long long
#define endl "\n"
using namespace std;
const int maxn=1e6+5,mod=1e9+7,inf=1e18;
int read(){int x=0,f=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}while(ch>='0' && ch<='9')x=x*10+ch-'0',ch=getchar();return x*f;}
void write(int x){if(x<0){putchar('-'),x=-x;}if(x>9){write(x/10);}putchar(x%10+'0');return;}
int fpow(int a,int b,int p){if(b==0){return 1;}int res=fpow(a,b/2,p)%p;if(b%2==1){return((res*res)%p*a)%p;}else{return(res*res)%p;}}
int cnt,n,a[maxn],fa[maxn];
int find(int x){
cnt++;
if(fa[x]==x){
return x;
}
return find(fa[x]);
}
signed main(){
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
fa[i]=i;
}
int ans=inf;
for(int i=1;i<=n;i++){
cnt=0;
if(find(a[i])==i){
ans=min(ans,cnt);
}
else{
fa[i]=a[i];
}
}
cout<<ans<<endl;
return 0;
}
本人(KK_SpongeBob)蒟蒻,写不出好文章,但转载请注明原文链接:https://www.cnblogs.com/OIer-QAQ/p/18823440

浙公网安备 33010602011771号