LQ0123 小朋友崇拜圈DFS
Posted 海岛Blog
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LQ0123 小朋友崇拜圈DFS相关的知识,希望对你有一定的参考价值。
题目来源:蓝桥杯2018初赛 C++ C组G题
题目描述
班里N个小朋友,每个人都有自己最崇拜的一个小朋友(也可以是自己)。
在一个游戏中,需要小朋友坐一个圈,
每个小朋友都有自己最崇拜的小朋友在他的右手边。
求满足条件的圈最大多少人?
小朋友编号为1,2,3,…N
输入格式
输入第一行,一个整数N(3<N<100000)
接下来一行N个整数,由空格分开。表示每位小朋友崇拜的小朋友的编号。
输出格式
输出一个整数,表示满足条件的最大圈的人数。
输入样例
9
3 4 2 5 3 8 4 6 9
输出样例
4
数据范围与提示
如图所示,崇拜关系用箭头表示,红色表示不在圈中。
显然,最大圈是[2 4 5 3] 构成的圈
问题分析
用DFS求最大圈。
AC的C语言程序如下:
/* LQ0123 小朋友崇拜圈 */
#include <stdio.h>
#include <string.h>
#define MAX(a, b) ((a) > (b) ? (a) : (b))
#define N 100000
int n, g[N + 1], vis[N + 1], ans = 0;
void dfs(int u, int v, int t)
if (u == v)
ans = MAX(ans, t);
else if (vis[u] == 0)
vis[u] = 1;
dfs(g[u], v, t + 1);
int main()
scanf("%d", &n);
for (int i = 1; i <= n; i++)
scanf("%d", &g[i]);
for (int i = 1; i <= n; i++)
memset(vis, 0, sizeof vis);
vis[i] = 1;
dfs(g[i], i, 1);
printf("%d\\n", ans);
return 0;
以上是关于LQ0123 小朋友崇拜圈DFS的主要内容,如果未能解决你的问题,请参考以下文章
Leetcode之深度优先搜索(DFS)专题-547. 朋友圈(Friend Circles)