班里 N 个小朋友,每个人都有自己最崇拜的一个小朋友(也可以是自己)。
在一个游戏中,需要小朋友坐一个圈,每个小朋友都有自己最崇拜的小朋友在他的右手边。
求满足条件的圈最大多少人?
小朋友编号为 1,2,3,…N。
输入格式: 第一行,一个整数 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;
}