加载中...
虚树是一种针对多组树上询问的优化技术。当每次询问只涉及少量关键点时,它抽取这些关键点及其两两最近公共祖先,构建一棵规模远小于原树的等价树,使单次处理复杂度只与关键点数量相关。

| 类别 | 树上辅助结构 |
| 构建复杂度 | O(k log k) |
| 节点规模 | O(k) |
| 依赖结构 | 最近公共祖先 |
| 适用问题 | 多询问树形 DP |
虚树(Virtual Tree),又称关键点树,是一种用于加速树上多询问问题的辅助结构。当每组询问只关注原树中的一部分关键节点时,虚树把这些关键点以及它们之间必要的最近公共祖先压缩成一棵小树,保留原有的祖先关系,从而避免每次都在整棵大树上计算。
某些问题给出一棵固定的大树,并有多组询问,每组指定若干关键点,要求在这些点构成的结构上做动态规划或统计。若询问总点数不大,但直接在原树上处理会因树大而超时。虚树的思想是:只有关键点和它们两两的最近公共祖先才对结果有影响,其余节点可以忽略或压缩成边,构造出的虚树节点数是关键点数的常数倍。
虚树常用于多次给定关键点集合、要求在其上做树形动态规划的问题,例如统计关键点间的最小割边权和、关键点到根路径的交集、树上覆盖与染色等。它把总复杂度从与树规模相关转化为与关键点总量相关。
问:为什么虚树节点数只有关键点的常数倍?答:每插入一个关键点最多新增一个作为最近公共祖先的辅助节点,因此总节点数不超过关键点数的两倍。
问:构建虚树前为什么要按 DFS 序排序?答:DFS 序能保证节点按照进入子树的先后排列,配合单调栈可正确恢复祖先后代关系,避免连错边。

| 类别 | 树上辅助结构 |
| 构建复杂度 | O(k log k) |
| 节点规模 | O(k) |
| 依赖结构 | 最近公共祖先 |
| 适用问题 | 多询问树形 DP |
登录 后参与讨论
暂无讨论,来发表第一条评论吧