182 小朋友崇拜圈

 简单的例子,要弄清楚过程。

#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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值