题目描述
班里 N 个小朋友,每个人都有自己最崇拜的一个小朋友(也可以是自己)。
在一个游戏中,需要小朋友坐一个圈,每个小朋友都有自己最崇拜的小朋友在他的右手边。
求满足条件的圈最大多少人?
小朋友编号为 1,2,3,⋯N。
输入描述
输入第一行,一个整数 N(3<N<105)。
接下来一行 N 个整数,由空格分开。
输出描述
要求输出一个整数,表示满足条件的最大圈的人数。
输入输出样例
示例
输入
9
3 4 2 5 3 8 4 6 9
输出
4
样例解释
如下图所示,崇拜关系用箭头表示,红色表示不在圈中。
显然,最大圈是[2 4 5 3] 构成的圈。
运行限制
- 最大运行时间:1s
- 最大运行内存: 256M
#include<iostream>
#include<cmath>
#include<string>
#include<algorithm>
using namespace std;
int a[100001],visit[100001],sum=1,mark=0;
//3 4 2 5 3 8 4 6 9
//1 2 3 4 5 6 7 8 9
void dfs(int j,int start){
if(visit[j]==1&&j==start){//如果此时的j正好都等于起始 start
sum=max(sum,mark); //说明绕了一圈,将现在的mark和上一次for循环的sum比较
return; //要最大的并更新sum。
}
else
{
mark++;//每一层dfs+1,即每到一个朋友+1
if(visit[j]==1){//若此时搜索是曾经标记的,说明饶了一圈但终点不是start
return;
}
else{
visit[j]=1;
dfs(a[j],start);
}
}
}
int main()
{
int n;
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
}
for(int i=1;i<=n;i++){
for(int k=1;k<=n;k++)
visit[k]=0;
mark=0;
dfs(i,i);
}
cout<<sum;
return 0;
}