思路:遍历每个小朋友作为起点计算出以他为中心的环的大小,存入答案,并与下个小朋友构成的环比较,取两者中较大的值
dfs(x,st,res)x表示前一个小朋友崇拜的人,st表示崇拜圈的起点,res表示该圈当前已存在多少小朋友。
C++代码:
#include<iostream>
using namespace std;
typedef long long ll;
ll a[10010];//i位置的小朋友崇拜的小朋友a[i]
ll N;
ll ans=0;
void dfs(ll x,ll st,ll res)//x崇拜的人,st起始地点,res当前环中元素个数
{
if(res>N)//找不到环时直接退出
return ;
if(st==x)//当找到一整个环后判断两个环的大小
{
ans=max(ans,res);
return ;
}
dfs(a[x],st,res+1);//a[x]迭代的关键
}
int main()
{
// 请在此输入您的代码
cin>>N;
for(int i=1;i<=N;i++)
{
cin>>a[i];
}
for(int i=1;i<=N;i++)
{
dfs(a[i],i,1);
}
cout<<ans;
return 0;
}
希望对有需要的人能有所帮助,欢迎大家有什么问题到评论区里一起讨论!