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)

[LeetCode] 547. Friend Circles 朋友圈

L1-020 帅到没朋友

LQ0131 字母阵列DFS

LQ0119 全球变暖DFS

LQ0144 方格分割DFS