#1518 : 最大集合
原创
©著作权归作者所有:来自51CTO博客作者是那北方的风的原创作品,请联系作者获取转载授权,否则将追究法律责任
描述
给定一个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]的大小。
样例输入
样例输出
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;
}