从每一个小朋友开始dfs,当找到最后一个崇拜第一个的时候就更新最终值,因为再往下去就陷入死循环了
#include<iostream> #include<cstring> #include<algorithm> using namespace std ; const int N = 5e5 + 10 ; int n ; int b[N] ; int ans ; struct node{//存当前点,x是下标,y是崇拜的同学 int x , y ; node(int xx, int yy){ x = xx , y = yy ; } }; vector<node> a ; bool v[N] ; void dfs(int u ){ if(a[0].x == a[u-1].y) { ans = max(ans,u) ; return ; } if(!v[a[u-1].y]){ a.push_back(node(a[u-1].y,b[a[u-1].y])) ;//把当前被崇拜的这个小朋友插入数组中 v[a[u-1].y] = 1; dfs(u+1) ; } return ; } int main(){ cin >> n ; for(int i = 1 ; i <= n ; i ++){ cin >> b[i] ; } for(int i = 1 ; i <= n ; i++){ a.push_back(node(i,b[i])) ; memset(v,0,sizeof v) ; v[i] = 1 ; dfs(1); a.clear() ; } cout << ans << endl ; }