solution1(通过%87.5)
#include<iostream>
#include<string.h>
using namespace std;
const int maxn = 10e5 + 10;
int idol[maxn], flag[maxn];
int n, ans = 0, start;
void dfs(int index, int cnt){
if(flag[index]){
if(index == start && cnt > ans) ans = cnt;
return ;
}
flag[index] = 1;
dfs(idol[index], cnt + 1);
}
int main(){
scanf("%d", &n);
for(int i = 1; i <= n; i++){
scanf("%d", idol + i);
}
for(int i = 1; i <= n; i++){
start = i;
memset(flag, 0, sizeof(flag));//时间复杂度O(n)
dfs(i, 0);
}
printf("%d", ans);
return 0;
}
solution2
#include<iostream>
using namespace std;
const int maxn = 10e5 + 10;
int idol[maxn], flag[maxn];
int n, ans = 0, start;
void dfs(int index, int cnt){
if(flag[index]){//出现环路
if(index == start && cnt > ans) ans = cnt;//回到原点,且圈更大则更新
return ;
}
flag[index] = 1;
dfs(idol[index], cnt + 1);
flag[index] = 0;//回溯,避免影响下一次的搜索
}
int main(){
scanf("%d", &n);
for(int i = 1; i <= n; i++){//小朋友的崇拜对象编号从1开始,记录时保持统一
scanf("%d", idol + i);
}
for(int i = 1; i <= n; i++){//以第i个小朋友为起点找圈
start = i;//标记起点位置
dfs(i, 0);
}
printf("%d", ans);
return 0;
}