题目给出的图很特殊(然而本箬蒻并不会基环树)
可以看出最长简单路径无非就一种情况:从某点开始走,直到遇见某个环,在环上转一圈。
(1)没有环的话直接记忆化搜索即可。
(2)环的处理:遇见环的时候定义某点为圆开始,然后把圆上的点的dp值全部换为圆的周长即可
int to[MAXN],dp[MAXN],ist[MAXN],ring[MAXN];//是否是圆的开始
void dfs(int x)
{
if(x==to[x])//注意特判
{
dp[x]=1;
return;
}
if(ist[to[x]])
{
dp[x]=1,ring[to[x]]=1;
return;
}
ist[x]=1;
if(dp[to[x]]==0) dfs(to[x]);
dp[x]=dp[to[x]]+1;
if(ring[x]) for(int j=to[x];j!=x;j=to[j]) dp[j]=dp[x];
ring[x]=0,ist[x]=0;
}
signed main()
{
int n;cin>>n;
rpp(i,n) cin>>to[i];
int ans=0;
rpp(i,n)
{
if(dp[i]==0) dfs(i);
ans=max(ans,dp[i]);
}
cout<<ans<<endl;
return 0;
}