“其中 $m$ 是当前边数,生成森林由 Euler Tour Tree维护。原论文与后续实现可进一步改善查询或常数;这里固定上述版本,不把 connectivity、动态最小生成树和二边连通的…”
表示不变量 ​
对 represented forest 中每棵无向树
每棵树的循环 tour 从任意位置切开,存入支持以下序列操作的平衡搜索树:
叶按 tour 顺序排列,内部节点维护大小和幺半群摘要。结构树只是序列容器;它的父子关系不是 represented tree 的父子关系。每个 represented 顶点或有向边保存指向其叶出现的句柄,以便在
选定实现下的复杂度 ​
若序列使用隐式随机 Treap,则对任意预先固定的合法操作序列,split/join 的期望时间为
- 预处理与空间:
; - reroot、link、cut:期望
; - connected:比较两处 marker 所在序列根,期望
; - component aggregate:找到序列根后读取摘要,期望
。
这里的期望来自随机优先级,而非输入图分布。若对手能观察优先级并自适应构造操作,需重新说明随机保证或改用确定性平衡序列。
reroot、link 与 cut ​
Euler tour 是循环序列,改变 represented root 只需旋转序列。若顶点
设
的顺序 concatenate。两个新叶分别代表同一无向边的两个方向。link 前必须检查分量不同,否则结果不再是森林,Euler-tour-tree 的单 tour 不变量失效。
删除
切边为何正好得到两个分量 ​
树边
这条“桥的两次出现夹住一个分量”的不变量,是 cut 能用常数次 split/join 完成的原因;一般含圈图的边没有该性质,必须由外层动态图算法挑选生成森林。
具体例子:切开一条树边 ​
考虑树边
某个循环表示可含片段
删除
聚合中的重复计数 ​
顶点会在 Euler walk 中多次出现。若每个出现都存同一顶点权值,分量和会按度数重复计数。常见修复是只让每个顶点的专用 marker 贡献权值,所有有向边出现贡献单位元;这样序列根摘要恰为分量顶点聚合。边聚合则可只让一对有向出现中的指定代表贡献,或按需求设计可抵消编码。
静态 DFS preorder 中子树是一个连续区间;动态无向 Euler tour 的主要语义却是整棵分量的循环表示。若固定根并精心安排 entry/exit marker,可扩展某些子树查询,但 reroot、link 与 cut 会改变区间语义,必须单独证明。
失败边界与 Link–Cut 对照 ​
ETT 能直接判断分量、维护分量摘要,并作为 全动态连通性的生成森林容器。任意两点简单路径在循环 tour 中通常不是一个连续片段,所以路径最大值或路径乘积不如 Link–Cut Tree直接。
结构只维护森林。若外层图含非树边,ETT 可以保存选定生成森林,却不会自动寻找删树边后的 replacement edge;这正是全动态连通性算法需要额外层级和边集合的原因。
参考资料
- Monika R. Henzinger and Valerie King, “Randomized Fully Dynamic Graph Algorithms with Polylogarithmic Time per Operation,” Journal of the ACM 46(4), 1999.
- David Eppstein, Zvi Galil, Giuseppe F. Italiano, and Amnon Nissenzweig, “Sparsification — A Technique for Speeding Up Dynamic Graph Algorithms,” JACM 44(5), 1997.
- Erik D. Demaine, Advanced Data Structures, MIT 6.851 lecture notes, Euler-tour trees and dynamic forests.