虚树学习笔记

虚树是对于若干关键点,新建一个 \(\Omicron(k)\) 个节点的树,包含所有节点任意组合的 lca,来在上面做树形 DP,降低复杂度

lca 性质

以下默认树的总节点数为 \(n\)

  1. \(k\) 个节点两两组合的不同 lca 个数最多 \(k-1\)
    证明:将所有节点按 dfn 值排序,对于不相邻的两个点 \(x,y, dfn_x < dfn_y\),设它们的 lca 为 \(p\)。当 \(p = x\)\(p = y\) 时,显然此时仍有 \(x\) 右边或 \(y\) 左边的点 \(u\)\(x\)\(y\) 的 lca 为 p;否则,\(x\)\(y\) 一定在 \(p\) 的子树中,则必存在一点 \(u\),为 \(x\) 子树内 dfn 值最大的点,那么 \(u\)\(u\) 的下一个点的 lca 一定为 \(p\)

  2. \(k\) 个节点,所有节点任意组合的不同 lca 个数最多 \(k-1\)
    证明同上

  3. \(k\) 个节点,建出虚树后只有一个根节点
    证明:全部节点的 lca 的子树包含了所有 lca

建树

二次排序+lca连边

有了刚才的结论,先按 dfn 排序,然后相邻点对 lca,把所有点丢进去去重,再按 dfn 排序,最后相邻点 \(x,y\)\(LCA(x,y) \rightarrow y\) 的边即可,证明显然

posted @ 2025-11-27 21:16  huangyuze  阅读(1)  评论(0)    收藏  举报