班里 N 个小朋友,每个人都有自己最崇拜的一个小朋友(也可以是自己)。

在一个游戏中,需要小朋友坐一个圈,每个小朋友都有自己最崇拜的小朋友在他的右手边。

求满足条件的圈最大多少人?

小朋友编号为 1,2,3,…N。 alt

输入格式: 第一行,一个整数 N。 3<N<10^5

接下来一行 N 个整数,由空格分开。

输出格式:

输出一个整数,表示满足条件的最大圈的人数。

输入样例:

9

3 4 2 5 3 8 4 6 9

输出样例:

4

下面是解题思路:

求最大值直接暴搜,用dfs。把所有小朋友当做这个循环的开始尝试一遍。当这个小朋友再次出现的时候如果形成闭环则结束,判断取值是否为最大。如果没有形成闭环则直接省去这个小朋友这条线。

下面是AC代码:

#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
const int N=1e5+10;
int n;
int a[N];
int num=0;
int sum;
bool flag[N];

void dfs(int be,int ed)
{
    if(flag[be])//判断dfs的结束条件
    {
        if(be==ed)//如果形成闭环那么这个值才成立
            num=max(num,sum);
        return ;
    }

    sum++;
    flag[be]=true;
    dfs(a[be],ed);
    flag[be]=false;
}
int main()
{
    scanf("%d",&n);
    for(int i=1; i<n+1; i++)//从1开始是因为小朋友的编号从1开始
    {
        scanf("%d",&a[i]);
    }
    for(int i=1; i<n+1; i++)
    {
        sum=0;//搜索该小朋友最大闭环之前先把闭环数清零
        dfs(i,i);
    }
    printf("%d\n",num);
    return 0;
}