1 条题解
-
0
题解
思路
先把最优目标转化为“输入树未出现的最小有根树类型”,再用一条前缀链连接这个缺失类型。关键是同时证明该构造给出的上界与任意输出都必须满足的下界相等。
最优值的刻画
把输入树中所有顶点子树的同构类型记为集合 。设 是按顶点数计最小的、类型不属于 的有根树,并令 。
先说明答案不超过 。构造一条含 个顶点的链,再把 的根接在链尾。链上每个顶点的子树都完整包含 ,因而不可能属于 ; 本身也不属于 。只有 内除根外的 个顶点可能产生匹配,所以匹配数至多为 。
再说明答案不少于 。在任意候选树中,取顶点数不少于 且顶点数最小的一棵顶点子树。它的每棵真子树都少于 个顶点,而其中至少有 个顶点子树。根据 的最小性,所有少于 个顶点的有根树类型都属于 ,所以至少有 个匹配。
因此最优值恰为 。若最小缺失类型比整棵输出树还大,则所有不超过 个顶点的类型都已出现,直接输出原树即可。
枚举最小缺失类型
一棵有根树的同构类型由根的各棵儿子子树类型的多重集合唯一决定。按顶点数从小到大枚举类型;同一大小内,要求儿子类型编号非递减,就能不重不漏地枚举所有无标号有根树。
对输入树自底向上处理。只需记录大小不超过 的顶点子树,并把排序后的儿子类型编号序列映射成一个精确类型编号。随后扫描枚举表,找到第一个未在输入树出现的类型。
为什么枚举到 一定足够:大小恰为 的无标号有根树超过 种。若它们全都在输入树中出现,这些对应的顶点子树互不相同,且每棵都有 个顶点;由子树的包含关系可推出所需顶点总量超过 ,与限制矛盾。因此在大小不超过 时一定已经出现缺失类型。
最后按类型表递归还原 ,在它之前接上所需长度的链即可。还原深度至多 ;输入树本身使用迭代遍历,避免深链递归爆栈。
做法
- 自底向上给输入树中大小不超过 的顶点子树分配精确同构类型编号。
- 按大小枚举全部不超过 点的无标号有根树,找到输入中第一个没有出现的类型 。
- 若 ,输出原树;否则输出一条 点的链,并把 的根接到链尾。
子任务算法
- 子任务 1:用 Prüfer 序列枚举所有标号树,逐一精确计算匹配数,取最优者。
- 子任务 2:链缺失的第一个类型是三点叉形,星形树缺失的第一个类型是两点链,可直接构造。
- 子任务 3:用规范括号串表示每棵顶点子树并枚举缺失类型,字符串总长度在该范围内可承受。
- 子任务 4:使用整数类型编号和按大小枚举的完整类型表。
正确性结论
上述下界证明说明任何输出至少产生 个匹配;链加最小缺失树的构造达到这个下界,所以输出必然最优。类型编号由完整的儿子类型多重集合决定,故缺失类型的判定与有根树同构定义等价。
复杂度
输入树的类型处理需要对子类型排序,总时间为 ,类型枚举只涉及大小不超过 的固定有限表。空间复杂度为 。
- 1
信息
- ID
- 931
- 时间
- 5000ms
- 内存
- 512MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者