1 条题解
-
0
题意理解
- 树 有 个节点。
- 树 有 个节点。
- 树 是由树 增加一个叶子节点(并可能重新编号)得到的。
- 我们要找出树 中多出来的那个叶节点。
注意:
- 增加一个叶子节点意味着在树 的某个节点上连一个新节点(新节点度为 )。
- 在树 中,这个新节点是叶子(度 = 1),并且删除它后,剩下的图应该与树 同构(节点编号可以不同,但结构相同)。
关键思路
-
度数分析
在树 中,多出来的那个叶子节点在树 中不存在,所以它的度数为 。
但是树 中可能有多个度数为 的节点(叶子),不能仅凭度数为 就确定。 -
同构判断
如果我们从树 中删除一个叶子节点 (以及它连的边),剩下的图应该是一棵 个节点的树,并且与树 同构。 -
直接做法复杂度
对树 的每个叶子节点,删除它,检查剩下的树是否与 同构,这样最坏 ,不可行。 -
优化思路
考虑树哈希:- 对树 计算一个哈希值(例如用 AHU 哈希或子树大小哈希等,保证同构树哈希相同,不同构大概率不同)。
- 对树 ,如果删除一个叶子 ,我们只需要计算删除 后树的哈希值,看是否等于树 的哈希值。
- 删除叶子 后,树 的哈希值可以通过动态树哈希或预处理树哈希后 或 计算。
-
具体步骤
- 选一个树哈希方法(例如用质数权重,子树哈希 = 1 + 。
- 先以任意根对树 做 DFS 计算哈希。
- 对树 ,任选一个根(如 1)做 DFS 计算哈希,并记录每个节点作为根时整棵树的哈希(换根 DP)。
- 对树 的每个叶子节点 ,它的父节点是 ,删除 后,树 的根可以设为 (因为删除叶子不影响其他部分结构),我们得到以 为根时树 去掉 后的哈希值(其实就是 在树 中少一个子树的哈希值),比较它和树 的哈希值。
- 如果匹配,说明 是多余叶子。
算法步骤
- 读入 ,读入树 和树 的边。
- 选择一个哈希方法(例如用质数表对应节点度数或子树大小)。
- 对树 计算哈希 (以 1 为根)。
- 对树 做 DFS 计算哈希,并做换根 DP 得到每个节点为根时的哈希值。
- 遍历树 中所有叶子节点(度 = 1),检查删除它后剩余树的哈希是否等于 。
- 输出符合条件的最小编号。
样例验证
样例:
5 1 2 2 3 1 4 1 5 1 2 2 3 3 4 4 5 3 6树 : 1-2, 2-3, 1-4, 1-5
树 : 1-2, 2-3, 3-4, 4-5, 3-6树 的叶子有:1, 5, 6
- 删除 1:剩下 2-3-4-5 和 3-6,与 同构
- 删除 5:剩下 1-2-3-4 和 3-6,与 不同构
- 删除 6:剩下 1-2-3-4-5(一条链),与 不同构
删除叶子 1 后,树 剩余结构是:
2-3-4-5 和 3-6(即节点 2 连 3,3 连 4 和 6,4 连 5),这其实和 同构
的结构:1 连 2,4,5;2 连 3。
把 的 1 映射到 的 3, 的 2 映射到 的 2, 的 3 映射到 的 4, 的 4 映射到 的 6, 的 5 映射到 的 5,确实同构。
所以删除 1 后是同构的,因此 1 是多余叶子。
复杂度
- 树哈希 + 换根 DP:
- 检查每个叶子:
总结:
这道题的核心是树同构判断结,通过树哈希和换根 DP 来高效求解。
- 1
信息
- ID
- 4777
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者