这是一道寻找最小环的题目。
在做的时候给每一个点染色。。
防止再做已经搜过的点(优化)
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 ",ans); return 0; }