简单的例子,要弄清楚过程。
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+9;
int a[N],n;
int len=0;//答案不但要初始化,而且max(long long ,int )是错误的比较
void dfs(int x,int index,int cnt)
{
//结束条件a
if(x==index)
{ //如果当前节点指向开始索引,当前cnt为环的长度,并且通过比较写入最大长度。
len=max(len,cnt);
return ;//不断的返回,直至i=2,进行新一条树枝的搜索。
}
if(cnt>n) return ;
dfs(a[x],index,cnt+1);
}
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
cin>>a[i];
for(int i=1;i<=n;i++)//每个点作为起点进行搜索
dfs(a[i],i,1);//a[i]:下一个位置;i:起点;1:圈的长度
//一个是有关长度,一个有关结束,一个有关起点
cout<<len<<endl;
return 0;
}
/*
树:根节点是0,第一级节点为1-n;
*/
六百级就是不一样
#include<bits/stdc++.h>
using namespace std;
const int N= 1e5 + 10;
int a[N],dfn[N];
int n,idx,mindfn;
int dfs(int b)
{
dfn[b]=++idx;//时间戳
if(dfn[a[b]]==0) return dfs(a[b]);//要有return ,若时间戳为空,继续递归
else//有时间戳的情况
{
if(dfn[a[b]]>=mindfn) return dfn[b]-dfn[a[b]]+1;//下一个崇拜对象大于等于最小时间戳,说明闭环
return 0;//下一个崇拜对象小于最小时间戳,说明不闭环
}
}
int main()
{ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
cin>>n;
for(int i=1;i<=n;i++) cin>>a[i];
int maxs=0;
for(int i=1;i<=n;i++) //从dfn为空的开始递归
{
if(dfn[i]==0)
{
mindfn=idx+1;//更新最小时间戳
maxs=max(dfs(i),maxs);//取所有环中的最大值
}
}
cout<<maxs<<endl;
return 0;
}