题意:
给定一个 1-N1−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]S[K] 的大小吗?
输入格式
第一行包含一个整数 N<100000
第二行包含 N 个两两不同的整数,A[1], A[2], ... A[N]。(1<=A[i]<=N)
输出格式
最大的 S[K] 的大小。
Sample 1
Inputcopy | Outputcopy |
---|---|
7 6 5 1 4 2 7 3 |
4 |
定义S[k]为从A[K]开始,不断将A[K]的值做下标,获得新的值,然后作为新的下标再获得新的值,如此反复得到的全部A中元素的集合,然后找一个元素最多的S[k]。
举个例子手算一遍,发现集合是闭合的,相当于考察连通性,求最大连通分支的元素个数。
AC Code:
#include<bits/stdc++.h>
using namespace std;
const int MXN=100000+7;
int fa[MXN],t[MXN],mark[MXN];
int findfa(int x){
if(fa[x]==x) return x;