#19252. 细菌菌落的代际普查

细菌菌落的代际普查

你好,我是阿西莫夫。

在生物学中,细菌的繁殖方式是典型的二分裂(Binary Fission):一个母细胞分裂成两个子细胞,子细胞再各自裂变。这在计算机科学中,完美对应了一棵二叉树的生长过程。

如果我们把最初的那个细菌称为“第1代”,它的子细胞就是“第2代”,孙子细胞是“第3代”……

广度优先搜索(BFS) 的本质就是 “层序遍历”。如果我们想知道“第 KK 代的所有细菌都有谁”,DFS(深度优先)会像钻井一样一条道走到黑,而 BFS 则会像水波纹一样一层一层荡开,这正是解决“代际问题”的最佳工具。

为了考察 std::queue 在二叉树 BFS 中的应用,我为你构思了这道题目。


[OI 题库] 细菌菌落的“代际普查” (Bacterial Generation Census)

题目背景

“指数增长是宇宙中最强大的力量之一,仅次于复利。”

在微生物实验室的培养皿中,科学家标记了编号为 11 的初代细菌(祖先)。经过一段时间的二分裂繁殖,形成了一个庞大的菌落族谱。

科学家想要研究遗传变异在不同代际间的分布情况。他们需要提取出KK 的所有存活细菌样本进行分析。

请注意:由于环境压力或突变,并非所有细菌都会成功分裂,有的可能只有一个子细胞,有的可能停止分裂。因此,这并不是一棵完美的满二叉树。

题目描述

给定一棵拥有 NN 个节点的二叉树,节点编号为 11NN1号节点 为根节点(第 1 代)。

输入给出每个节点的左右子节点编号。 请利用广度优先搜索(BFS) 算法,输出KK 所有细菌的编号。

要求

  1. 按照从左到右的顺序输出。
  2. 如果第 KK 代不存在任何细菌(KK 超过了树的深度),输出 Empty

输入格式

第一行包含两个整数 NNKK

  • NN:细菌总数。
  • KK:目标代数。

接下来 NN 行,第 ii 行包含两个整数 Li,RiL_i, R_i,分别表示 ii 号细菌 的左子细胞和右子细胞的编号。 (0 表示无对应子细胞)。

输出格式

一行,包含若干个整数,表示第 KK 代的所有节点编号,中间用空格分隔。 若无节点,输出 Empty

样例数据

样例 1

5 3
2 3
4 5
0 0
0 0
0 0
4 5

解析

  • 第1代:1
  • 第2代:2, 3
  • 第3代:4, 5
  • BFS 一层层搜下去,第3层就是 4 和 5。

样例 2 (树太浅)

3 5
2 3
0 0
0 0
Empty

解析:树只有 2 代,要求的第 5 代不存在。

样例 3 (缺如情况)

6 3
2 3
0 4
0 5
0 0
6 0
0 0
4 5

解析

  • 1 -> (2, 3)
  • 2 -> (无, 4)
  • 3 -> (无, 5)
  • 第3代节点是 2 的右孩子(4) 和 3 的右孩子(5)。注意 5 的孩子是 6(第4代)。

数据范围

  • 1KN100,0001 \le K \le N \le 100,000
  • 保证是一棵合法的树。