一.题目描述
二.解题思路
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;
}
四.问题
在提交答案后,有一个答案一直无法通过,找不到原因在哪,求大佬指点。