这是一道寻找最小环的题目。
在做的时候给每一个点染色。。
防止再做已经搜过的点(优化)
v[]表示是否访问的过,以及第一次访问该点的时间。
u[]表示染色。。
这道题还可以用拓补排序做。
当然,我不会写,。原理掌握的也不是很清楚。。所以,坐等以后填坑。。
下面贴代码
#include<iostream>
#include<cstdio>
#include<cstring>
#define inf 0x3f3f3f3f
using namespace std;
int n,ans=inf,now;
int a[200001];
int v[200001];
int u[200001];
void dfs(int x,int q){
if(v[x]!=0)
{
if(u[x]==now)
ans=min(ans,q-v[x]);
return ;
}
v[x]=q;
u[x]=now;
dfs(a[x],q+1);
}
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
for(int i=1;i<=n;i++)
{
now=i;
if(!v[i])
{
v[i]=1;
u[i]=now;
dfs(a[i],2);
}
}
printf("%d\n",ans);
return 0;
}