蓝桥杯2018省赛真题——小朋友的崇拜圈(DFS暴搜)

本文介绍了如何通过深度优先搜索(DFS)解决编程问题,给定一个小朋友之间的崇拜关系数组,找到一个闭合环,使得环中每个小朋友都崇拜环中的下一个小朋友,输出最大的环长。
摘要由CSDN通过智能技术生成

 题意分析:每个小朋友都有自己的崇拜对象,也可以是自己。关键在于围成圈的时候最后一个人的崇拜对象一定是开始的小朋友,这样才能形成闭环。所以直接dfs暴力搜索每一个小朋友作为开头的情况,然后递归调用dfs函数一直找崇拜的人的崇拜的人直到最后一个崇拜的是开头的小朋友。只要一直维护最大圈长ans就行。

#include <iostream>
using namespace std;
int a[100005];//储存小朋友的崇拜对象
int ans=0,len=0,n;//len统计圈的长度,ans用来记录最大的圈长len
void dfs(int x,int ll,int len){//ll表示此时圈子开始是哪个小朋友,x表示ll同学崇拜的人
//dfs不断搜索圈子开始的小朋友ll崇拜的人x以及x的崇拜的人,直到最后回到圈子开始的小朋友ll形成闭环
  if(len>n)return;
  if(x==ll){
    ans=max(ans,len);
    return;
  }
  dfs(a[x],ll,len+1);
}
int main()
{
  cin>>n;
  for(int i=0;i<n;i++){
    cin>>a[i];
  }
  //对每个小朋友都进行一遍搜索
  //由于答案只需要维护最大圈子长度ans
  //所以小朋友的编号从0开始还是从1开始都无所谓
  for(int i=0;i<n;i++){
    dfs(a[i],i,len);
  }
  cout<<ans;
  return 0;
}

  • 4
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值