题目描述
班里 N 个小朋友,每个人都有自己最崇拜的一个小朋友(也可以是自己)。
在一个游戏中,需要小朋友坐一个圈,每个小朋友都有自己最崇拜的小朋友在他的右手边。
求满足条件的圈最大多少人?
小朋友编号为1,2,3,⋯N。
输入描述
输入第一行,一个整数 N(3<N<10^5)。
接下来一行 N 个整数,由空格分开。
输出描述
要求输出一个整数,表示满足条件的最大圈的人数。
输入输出样例
示例
输入
9
3 4 2 5 3 8 4 6 9
输出
4
样例解释
如下图所示,崇拜关系用箭头表示,红色表示不在圈中。
显然,最大圈是[2 4 5 3] 构成的圈。
运行限制
- 最大运行时间:1s
- 最大运行内存: 256M
#include <iostream>
#include<cstring>
#include<math.h>
int vis[999999],cnt,MAX,stuMap[99999];//vis数组为0,表示未访问过,为1表示已经访问过
using namespace std;
void dfs(int i,int ori)//i表示当前小朋友的下标,ori表示第一个小朋友的下标
{
if(vis[i]&&i!=ori) return;//如果当前小朋友被访问过同时当前小朋友的下标和第一个小朋友下标不一样
//说明这个圈不满足条件 ,题目要求形成一个闭合的圈
if(vis[i]&&i==ori) //如果当前小朋友被访问过同时当前小朋友的下标和第一个小朋友下标一样,说明这已经形成闭合圈
//记录下当前最多小朋友数
{
MAX=max(MAX,cnt);
return;
}
//不满足上面两个if条件,说明当前的小朋友都属于未访问过,则人数cnt+1
++cnt;
vis[i]=1;//将当前小朋友标记为已经访问
dfs(stuMap[i],ori);//递归,深搜遍历下一个小朋友的情况
vis[i]=0;//搜索回溯,退回,将当前小朋友标记为未访问
--cnt;//恢复原来状态
}
int main()
{
int N;
cin>>N;
for(int i=1;i<=N;i++)
cin>>stuMap[i];//输入每个小朋友崇拜的对象
memset(vis,0,sizeof(vis));//初始化vis默认值全为0
for(int i=1;i<=N;++i)//依次遍历每个小朋友并深搜
dfs(i,i);
cout<<MAX<<endl;
return 0;
}