算法学习----DFS----小朋友崇拜圈(蓝桥杯)

一.题目描述

3.小朋友崇拜圈 - 蓝桥云课 (lanqiao.cn)

二.解题思路

1.首先将图存储下来,采用数组,数组元素的序号加一即为小朋友的编号,数组元素存储小朋友的崇拜对象。

2.设计输入与输出。

3.设计函数dfs处理:

(1)首先确定递归的返回条件,当继续走下去只能遇到之前已经走过的元素时停止。

(2)如何判断该元素已经经过,为经过的元素做标记(即设计标记数组)。

(3)如何判断是否成环,当停止时的元素与起点元素重合时将其作为圈。

(4)如何得到圈的大小,在做标记时将标记数组的元素不断递增,最后一个元素的标记数组的的元素-1即为圈的大小。(由于在判断之前进行的递增,所以要-1)。

(5)在递归之后,要取消标记,同时在main函数的for循环中要将起点标记取消。

三.代码如下

#include <iostream>


using namespace std;
const int N=10000;

int mark[N];
int chs[N];
int n;
int k = 1;
int sum;
int ans = 0;

void dfs(int i){
  mark[i] = k++;
  if(mark[chs[i]-1] != 0){
  	if(mark[chs[i]-1] == 1){
  	  ans = max(ans,k-1);
  	}
    k = 1;
    return ;
  }
  //sum++; 
  dfs(chs[i]-1);
  mark[chs[i]-1] = 0;
}

int main()
{
  cin>>n;
  for(int i=0;i<n;i++){
  	int x;
  	cin>>x;
  	chs[i] = x;
  	mark[i] = 0;
  }
  for(int i=0;i<n;i++){
    dfs(i);
    mark[i]=0;
  }
  cout<<ans;
  return 0;
}

四.问题

在提交答案后,有一个答案一直无法通过,找不到原因在哪,求大佬指点。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值