Skip to content

模型Model

动态森林问题

施工中 · 内容逐步修订

Dynamic forest problem

维护无环树族的连接、断开与连通查询,并按所选版本增加有根或聚合接口。

形式陈述 ​

抽象接口 ​

作为动态图模型的受限接口,结构维护由树组成的 represented forest,核心支持 link(u,v)、cut(e) 与 connected;可选的有根接口包括 find-root、evert,其他扩展包括路径聚合与 subtree aggregate。Link 要求端点属于不同树;cut 要求目标边存在,并固定按边标识还是按父子关系指定。若提供 find-root、evert 或子树查询,每个分量还须保存指定根,并声明 link/cut 后如何选择新根。无根边集保持不变的换根操作,也会改变这份有根状态。路径查询只对同一分量内的端点定义;不连通时应返回明确的无路径结果。

例如维护网络骨架上两点路径最大边:link 接入新边,cut 删除故障边,path-max 支持 MST 替换判断。辅助结构可能是 link-cut tree 或 Euler-tour tree,但它不改变外部森林。

直觉

能力边界 ​

路径聚合和子树聚合并不自动等价。Link-cut tree 擅长换根后的路径;Euler-tour tree 把整分量表示为循环序列;要把指定根下的子树定位成区间,还需相应的进入/退出标记和边界维护。加入非树边后 represented object 不再是森林,须由外层动态图算法选择生成森林并管理候选替代边。

路径最大值需规定权在边还是点上,以及空路径的聚合单位元。复杂度则按接口注明最坏界或摊还界。

Evert 改变父子方向,但保持无向路径的边集合,因此路径最大值不变。子树由根的方向决定,换根后会改变;支持路径聚合的结构还需额外设计才能维护子树摘要。

link、cut、路径与子树接口
例子与边界

状态轨迹 ​

初始有三棵单点树。执行 link(1,2,w=4)、link(2,3,w=7) 后,connected(1,3) 为真,path-max(1,3)=7。再次 link(1,3) 会成环,违反 link 的前提。每步森林的边数始终等于节点数减去分量数。

先以 1 为根,subtree(2)={2,3}。执行 evert(3) 后,subtree(2)={1,2},而 path-max(1,3) 仍为 7。随后 cut(2,3),1 与 3 才变得不连通。这个轨迹区分了换根造成的朝向变化和删边造成的连通性变化。

推论与应用

三类实现对应不同的聚合接口。Link–Cut Tree把 preferred path 表示为辅助伸展树,适合 link、cut、evert 与路径聚合;Euler Tour Tree把每棵树编码成可分裂合并的 Euler 序列,直接支持连通性和分量摘要;支持有根子树时须另行维护区间语义;Top Tree以至多两个边界点的 cluster 分层合并,更对称地承载路径、直径和树上动态规划。选择结构前必须先固定查询是路径型、子树型还是 cluster 型。

聚合维护 ​

按边取权时,空路径的最大值单位元可取 −∞,反转路径不改变结果;若为非交换字符串拼接,evert 还须维护正反两个摘要。对边权最大值,lazy path-add 在覆盖目标路径的辅助树节点上同步更新边值、非空路径最大值摘要和 tag;下推时再把增量传给孩子。点权查询即使两端相同也含一个点,不能与空边路径混用。所报数据结构成本通常假设摘要和标记占常数字、合并与施加标记为常数时间;输出整条路径或拼出长字符串时另计输出成本。

参考资料
  • Sleator, Tarjan, “A Data Structure for Dynamic Trees,” JCSS, 1983.
  • Henzinger, King, dynamic graph framework, STOC 1995.
关系图谱12 个相邻概念 · 3 类关系

拖动节点调整位置。

显示关系

显示:依赖

  1. 前置三跳
  2. 前置二跳
  3. 前置一跳
  4. 当前条目
  5. 后续一跳
  6. 后续二跳
  7. 后续三跳
文字版关系按与当前条目的最短距离分组
类型化关系