思路:
输入的n个数,表示第i个小朋友最喜欢的小朋友
此处用到dfn时间戳
rec记录最小时间戳,避免走到已计算过的环中去,比如7->4(7的时间戳是8,4的时间戳是4,但次数最小时间戳是6,所以不构成一个环)
由于此题目不止一个起点,所以我们遍历i去dfs,表示从i点出发,每次能达到的最大环的大小
#include<bits/stdc++.h>
using namespace std;
const int N = 1e5+9;
int n, rec, a[N], dfn[N], ans, idx;
int dfs(int x)
{
dfn[x] = idx++;
if (dfn[a[x]])
{
if(dfn[a[x]] >= rec) return dfn[x] - dfn[a[x]] + 1;
}
return dfs(a[x]);
}
int main()
{
cin >> n;
for (int i = 1; i <= n; i++) cin >> a[i];
for (int i = 1; i <= n; i++)
{
if (!dfn[i])
{
rec = idx + 1;//记录最小时间戳
ans = max(ans, dfs(i));
}
}
cout << ans << '\n';
return 0;
}