用拓扑优化的
#include <bits/stdc++.h>
using namespace std;
int n,minn=1000000000;
int a[2000001],ind[2000001],vis[2000001];
vector <int> g[2000001];
queue <int> q;
int dfs(int x,int deep){
if(vis[x]) minn=min(minn,deep-vis[x]);
else{
vis[x]=deep;
for(int i=0;i!=g[x].size();++i) dfs(i,deep+1);
}
}
void work(){
cin >> n;
for(int i=1;i<=n;++i) scanf("%d",&a[i]);
for(int i=1;i<=n;++i) g[i].push_back(a[i]),++ind[a[i]];
for(int i=1;i<=n;++i) if(!ind[i]) q.push(i);
while(!q.empty()){
int x=q.front();
q.pop();
for(int i=0;i!=g[x].size();++i) if(--ind[i]==0) q.push(i);
}
for(int i=1;i<=n;++i) if(ind[i] && !vis[i]) dfs(i,1);
printf("%d",minn);
}
int main(){work();}
谢谢各大佬,蒟蒻实在太垃了