#1518 : 最大集合
时间限制:
10000ms
单点时限:
1000ms
内存限制:
256MB
描述
给定一个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
代码:
#include<bits/stdc++.h>
using namespace std;
int a[100010];
int b[100010];
int vis[100010];
void dfs(int x,int p,int &ans)
{
if(x==p&&ans!=0)
return;
ans++;
//cout<<ans<<"****"<<endl;
vis[x]=1;
dfs(a[x],p,ans);
}
int main()
{
int n;
int maxx=0;
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
cin>>a[i];
}
memset(vis,0,sizeof(vis));
int ans;
for(int i=1;i<=n;i++)
{
ans=0;
if(!vis[i])
dfs(i,i,ans);
//cout<<ans<<"***"<<endl;
maxx=max(maxx,ans);
}
cout<<maxx<<endl;
return 0;
}
这道题的坑就在于一般搜索易超时。加个vis标志一下,搜过的就不用再搜了。。。过了很久才想到。