基于 top cluster 理论的树分块算法小记
基于 top cluster 理论的树分块算法小记
0 前置知识
- 树分块
1 簇(Cluster)
1.1 定义
树簇为树的一个联通子图,至多有两个点与簇外的其他点有边相连,这两个点被称为界点。
树簇内不是界点的点被称为内点,显然内点可以有很多个。
两个界点间的路径被称为簇路径。
注意簇不一定是一条链,界点不一定是簇的叶子。
1.2 操作
簇有两种合并操作,通过这两种合并方式的合并过程可以得到一个二叉树,这个二叉树即为 Top tree。
由于簇的操作与后面的树分块没有关系,因此这里并不介绍。
2 树分块
2.1 定义
网上的资料都说这种树分块算法基于与 Top tree 有关的 top cluster 理论,但是我到现在都不清楚这个理论到底是什么。
我们希望通过树簇来进行树分块。具体地,这个树分块理论满足以下条件:
-
对于给定的 \(n\) 和 \(B\),将树划分成 \(O(\frac{n}{B})\) 个簇,每个簇的大小平均为 \(O(B)\)。
-
不同簇的边集不相交。
-
如果一个簇有两个界点,则它们为祖孙关系。其中深度浅的称为上界点,深度深的称为下界点。
-
除了界点外,一个簇中的其他点(即内点)不会在其它簇中出现。
-
一个界点会是一个簇的下界点,也是其它包含它的簇的上界点。(根节点除外,根节点只会是上界点)
通过保留所有界点,将每个簇看作一条边,得到的一棵新树称之为收缩树。
这种分块算法是基于对边进行分块,因此下文中的各种对象也都是针对边的。当然可以简单地由边转化到点。
2.2 算法流程
2.2.1 界点的选取
任选一个节点作为根节点,并强制根节点作为界点(为了防止各种 corner case)。