描述

给定一个1-N的排列A[1], A[2], ... A[N],定义集合S[K] = {A[K], A[A[K]], A[A[A[K]]] ... }。  

显然对于任意的K=1..N,S[K]都是有限集合。  

你能求出其中包含整数最多的S[K]的大小吗?

输入

第一行包含一个整数N。(1 <= N <= 100000)  

第二行包含N个两两不同的整数,A[1], A[2], ... A[N]。(1 <= A[i] <= N)

输出

最大的S[K]的大小。

样例输入

7  
6 5 1 4 2 7 3

样例输出

4


dfs搜索,维护最大值。好久之前做的,发个博客保存起来。

代码:

#include<bits/stdc++.h>

using namespace std;
int a[110000];
int v[110000];
int ma;
void dfs(int i,int ans,int fa)
{
ans++;
if(i==fa&&ans!=0)return;
if(!v[i])
{
v[i]=1;
dfs(a[i],ans,fa);
}
if(ma<ans)ma=ans;

}
int main()
{
int n;
while(~scanf("%d",&n))
{
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
}
ma=0;
memset(v,0,sizeof(v));
for(int i=1;i<=n;i++)
{

int ans=0;
if(!v[i])
{
v[i]=1;
dfs(a[i],ans+1,i);
}
if(ma<ans)ma=ans;

}
cout<<ma<<endl;
}
return 0;
}