看到数据200000后有些懵逼,然而写爆搜却过了。。。
#include<cstdio>
#include<cstring>
#define M 200000
int tell[M+1],r[M+1];
bool be[M+1],vis[M+1];
int ans=2147483647;
using namespace std;
inline int gi() {
int x=0;
char ch=' ';
while(ch==' '||ch=='\n')ch=getchar();
while(ch!=' '&&ch!='\n')x=x*10+ch-'0',ch=getchar();
return x;
}
inline void dfs(int n,int ak) {
if(vis[n]) {
if(ans>ak)ans=ak;
return;
}
vis[n]=1;
dfs(tell[n],ak+1);
}
int main() {
memset(be,1,sizeof(be));
int n=gi();
bool flag=1;
for(int i=1; i<=n; i++)tell[i]=gi(),r[tell[i]]++;
while(flag){flag=0;for(int i=1; i<=n; i++)if(r[i]==0&&be[i])be[i]=0,flag=1,r[tell[i]]--;}
for(int i=1; i<=n; i++)if(be[i]&&!vis[i])dfs(i,0);
printf("%d",ans);
return 0;
}