(」・ω・)」うー!(/・ω・)/にゃー!
——潜行吧奈亚子

树链剖分

树链剖分

定义

树链剖分用于将树分割成若干条链的形式,以维护树上路径的信息。

具体来说,将整棵树剖分为若干条链,使它组合成线性结构,然后用其他的数据结构维护信息。

前置知识——重链剖分

定义重子节点表示其子节点中子树最大的子结点。如果有多个子树最大的子结点,取其一。如果没有子节点,就无重子节点。

定义轻子节点表示剩余的所有子结点。

从这个结点到重子节点的边为重边

到其他轻子节点的边为轻边。

若干条首尾衔接的重边构成重链

把落单的结点也当作重链,那么整棵树就被剖分成若干条重链。
重链剖分

实现

基本思路:选取深度较深的点,往上跳直到抵达公共祖先,再dfs序往下遍历,以下图为例:
重链剖分
假如要算5号点到10号点的距离(即5号+4号+3号+2号+9号+10号)该怎么办?
首先比较\(top(5)\)\(top(10)\),发现\(top(10)\),也就是9号点更深一些,于是就在当前遍历到的点不是5号点的祖先时不断向上遍历\(father(top(\)当前所在点\())\)

posted @ 2021-12-25 22:06  GalaxyOier  阅读(41)  评论(0)    收藏  举报