#19252. 细菌菌落的代际普查
细菌菌落的代际普查
你好,我是阿西莫夫。
在生物学中,细菌的繁殖方式是典型的二分裂(Binary Fission):一个母细胞分裂成两个子细胞,子细胞再各自裂变。这在计算机科学中,完美对应了一棵二叉树的生长过程。
如果我们把最初的那个细菌称为“第1代”,它的子细胞就是“第2代”,孙子细胞是“第3代”……
广度优先搜索(BFS) 的本质就是 “层序遍历”。如果我们想知道“第 代的所有细菌都有谁”,DFS(深度优先)会像钻井一样一条道走到黑,而 BFS 则会像水波纹一样一层一层荡开,这正是解决“代际问题”的最佳工具。
为了考察 std::queue 在二叉树 BFS 中的应用,我为你构思了这道题目。
[OI 题库] 细菌菌落的“代际普查” (Bacterial Generation Census)
题目背景
“指数增长是宇宙中最强大的力量之一,仅次于复利。”
在微生物实验室的培养皿中,科学家标记了编号为 的初代细菌(祖先)。经过一段时间的二分裂繁殖,形成了一个庞大的菌落族谱。
科学家想要研究遗传变异在不同代际间的分布情况。他们需要提取出第 代 的所有存活细菌样本进行分析。
请注意:由于环境压力或突变,并非所有细菌都会成功分裂,有的可能只有一个子细胞,有的可能停止分裂。因此,这并不是一棵完美的满二叉树。
题目描述
给定一棵拥有 个节点的二叉树,节点编号为 到 。 1号节点 为根节点(第 1 代)。
输入给出每个节点的左右子节点编号。 请利用广度优先搜索(BFS) 算法,输出第 代 所有细菌的编号。
要求:
- 按照从左到右的顺序输出。
- 如果第 代不存在任何细菌( 超过了树的深度),输出
Empty。
输入格式
第一行包含两个整数 和 。
- :细菌总数。
- :目标代数。
接下来 行,第 行包含两个整数 ,分别表示 号细菌 的左子细胞和右子细胞的编号。
(0 表示无对应子细胞)。
输出格式
一行,包含若干个整数,表示第 代的所有节点编号,中间用空格分隔。
若无节点,输出 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代)。
数据范围
- 保证是一棵合法的树。