题目来源:蓝桥杯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;
}