【蓝桥杯】小朋友崇拜圈 C++ dfs

题目描述

【蓝桥杯】小朋友崇拜圈 C++ dfs_第1张图片

解题思路

需要注意的就是能满足题目条件的圈中,最后一个小朋友崇拜的一定是这个圈中的第一个小朋友,弄懂了这一点,其他部分和基本的深搜区别不大

C++代码

#include
using namespace std;
	long long resp[100010];//存第i个小朋友崇拜的人
	long long m_count[100010];//每个人被崇拜次数
	long long vis[100010];//标记选过的人
	long long n,ans = 0,cnt = 0;
void dfs(long long  i,long long  ori){//ori代表的是第一个人
	
	if(i != ori && vis[i]){
		return;
	}
	if(i == ori && vis[i]){//如果想围成一个圈,最后一个人崇拜的一定是第一个人
		ans = max(ans,cnt);
		return;
	}
	cnt++;
	vis[i] = true;
	dfs(resp[i],ori);
	vis[i] = false;
	cnt--;
}
int main()
{
	cin>>n;
	for(int i = 1; i <= n; i++){
		cin>>resp[i];
	}

	memset(vis, 0, sizeof(vis));
	for(int i = 1; i <=n; i++){
		dfs(i,i);
	}
	cout<<ans<<endl;
	return 0;
}

你可能感兴趣的:(深度优先,c++,蓝桥杯)