蓝桥杯—小朋友崇拜圈—深搜

本文介绍了一种关于小朋友崇拜圈的游戏问题,通过代码实现寻找满足每个小朋友右侧是其崇拜者的最大圆圈。输入一个小朋友的数量和他们的崇拜关系,输出最大可能的圆圈人数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、问题描述

班里N个小朋友,每个人都有自己最崇拜的一个小朋友(也可以是自己)。
  在一个游戏中,需要小朋友坐一个圈,
  每个小朋友都有自己最崇拜的小朋友在他的右手边。
  求满足条件的圈最大多少人?

  小朋友编号为1,2,3,...N
  输入第一行,一个整数N(3<N<100000)
  接下来一行N个整数,由空格分开。

  要求输出一个整数,表示满足条件的最大圈的人数。

  例如:

输入格式

  9
  3 4 2 5 3 8 4 6 9

  则程序应该输出:
  4

2、代码实现

import java.util.Scanner;

public class Main {
	//小朋友的个数
	static int n;
	//小朋友对应的崇拜者
	static int[] arr;
	static boolean[] visit;
	//崇拜圈的大小
	static int max = -1;
	
	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		n = scanner.nextInt();
		arr = new int[n + 1];
		visit = new boolean[n + 1];
		for(int i = 1;i <= n;i++) {
			arr[i] = scanner.nextInt();
		}
		
		for(int i = 1;i <= n;i++) {
			//以第i的小朋友为起点,寻找崇拜圈
			dfs(i);
		}
		System.out.println(max);
	}
	public static void dfs(int i) {
		int count = 0;
		int t = i;
		//这个小朋友还没有在圈内
		while(!visit[t]) {
			//设置他在圈内
			visit[t] = true;
			//寻找当前小朋友的崇拜者
			t = arr[t];
			count++;
		}
		//是否形成崇拜圈
		if(t == i) {
			if(count > max) {
				max = count;
			}
		}
		//每一轮都需要重置
		visit = new boolean[n + 1];
	}
}

### 蓝桥杯 2283 小朋友崇拜 解题思路 #### 题目分析 小朋友崇拜问题的核心在于构建一个有向图,其中每个节点代表一个小朋友,边表示崇拜关系。目标是找到最长的环路长度(即最大强连通分量中的循环路径)。这可以通过拓扑排序或者度优先索来解决。 #### 数据结构设计 为了高效处理这个问题,可以采用邻接表存储图的关系。通过数组 `in_degree` 记录每个节点的入度,以便后续进行拓扑排序操作[^1]。 #### 拓扑排序算法 利用队列实现拓扑排序,逐步移除入度为零的节点及其关联的边。最终剩下的节点构成若干个强连通分量,这些节点无法被进一步消去[^2]。 ```python from collections import deque, defaultdict def find_circle(n, edges): graph = defaultdict(list) in_degree = [0] * (n + 1) for a, b in edges: graph[a].append(b) in_degree[b] += 1 queue = deque([i for i in range(1, n+1) if in_degree[i]==0]) count_removed = 0 while queue: node = queue.popleft() count_removed += 1 for neighbor in graph[node]: in_degree[neighbor] -= 1 if in_degree[neighbor] == 0: queue.append(neighbor) remaining_nodes = n - count_removed return remaining_nodes ``` 上述代码实现了基于拓扑排序的方法找出未被消除的小朋友数量,间接反映了可能存在的崇拜大小。 #### 寻找最大环路 对于剩余的节点集合,需进一步探索其内部是否存在更具体的环路信息。此时可借助DFS遍历每一个尚未访问过的节点,并记录当前路径上的所有节点直至发现重复项为止,则该闭合链即为我们所求的一个环路实例。 ```python def dfs(node, visited, path, adj_list): if visited[node]: if node in path: cycle_length = len(path[path.index(node):]) return cycle_length else: return 0 visited[node] = True path.append(node) max_cycle = 0 for neighbor in adj_list[node]: current_cycle = dfs(neighbor, visited, path[:], adj_list) if current_cycle > max_cycle: max_cycle = current_cycle return max_cycle ``` 此部分函数用于入挖掘残留网络内的具体环状结构特性并返回最大的那个环长作为结果输出。 #### 综合应用 最后将两阶段逻辑结合起来完成整个解决方案的设计与编码工作即可满足题目需求。 ---
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

@小红花

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值