树链剖分
树链剖分
定义
树链剖分用于将树分割成若干条链的形式,以维护树上路径的信息。
具体来说,将整棵树剖分为若干条链,使它组合成线性结构,然后用其他的数据结构维护信息。
前置知识——重链剖分
定义重子节点表示其子节点中子树最大的子结点。如果有多个子树最大的子结点,取其一。如果没有子节点,就无重子节点。
定义轻子节点表示剩余的所有子结点。
从这个结点到重子节点的边为重边。
到其他轻子节点的边为轻边。
若干条首尾衔接的重边构成重链。
把落单的结点也当作重链,那么整棵树就被剖分成若干条重链。

实现
基本思路:选取深度较深的点,往上跳直到抵达公共祖先,再dfs序往下遍历,以下图为例:

假如要算5号点到10号点的距离(即5号+4号+3号+2号+9号+10号)该怎么办?
首先比较\(top(5)\)和\(top(10)\),发现\(top(10)\),也就是9号点更深一些,于是就在当前遍历到的点不是5号点的祖先时不断向上遍历\(father(top(\)当前所在点\())\)

浙公网安备 33010602011771号