题意分析:每个小朋友都有自己的崇拜对象,也可以是自己。关键在于围成圈的时候最后一个人的崇拜对象一定是开始的小朋友,这样才能形成闭环。所以直接dfs暴力搜索每一个小朋友作为开头的情况,然后递归调用dfs函数一直找崇拜的人的崇拜的人直到最后一个崇拜的是开头的小朋友。只要一直维护最大圈长ans就行。
#include <iostream>
using namespace std;
int a[100005];//储存小朋友的崇拜对象
int ans=0,len=0,n;//len统计圈的长度,ans用来记录最大的圈长len
void dfs(int x,int ll,int len){//ll表示此时圈子开始是哪个小朋友,x表示ll同学崇拜的人
//dfs不断搜索圈子开始的小朋友ll崇拜的人x以及x的崇拜的人,直到最后回到圈子开始的小朋友ll形成闭环
if(len>n)return;
if(x==ll){
ans=max(ans,len);
return;
}
dfs(a[x],ll,len+1);
}
int main()
{
cin>>n;
for(int i=0;i<n;i++){
cin>>a[i];
}
//对每个小朋友都进行一遍搜索
//由于答案只需要维护最大圈子长度ans
//所以小朋友的编号从0开始还是从1开始都无所谓
for(int i=0;i<n;i++){
dfs(a[i],i,len);
}
cout<<ans;
return 0;
}