Skip to content

算法Algorithm

离线动态连通

施工中 · 内容逐步修订

offline dynamic connectivity

把边的活跃时间区间分配给时间线段树,并用可回滚并查集回答离线连通查询。

形式陈述 ​

从操作流生成活跃区间 ​

在离线动态图协议下,固定 n 个带编号顶点,目标是在无向图的 add、remove、query 操作序列上回答连通查询,并且全部 q 个操作预先可见。可从空边集开始;若有 m0 条初始边,则先把它们登记为从时刻零生效。q=0 时没有查询,直接返回空答案列表。以下对 q≥1 扫描时间 0,…,q−1,对每个带身份的边保存尚未配对的 add 时刻栈;若边没有外部 ID,可用规范端点 (min(u,v), max(u,v)) 作为键,并让栈区分同端点重边。

add 把当前时刻压栈,remove 弹出匹配的 add 时刻并产生半开活跃区间 [tadd,tremove);扫描结束仍未删除的边产生 [tadd,q)。若接口禁止同一边重复激活,第二次 add 应直接报错,不能悄悄覆盖第一次的开始时间。允许平行边或自环的扩展也可按实例处理寿命;其连通查询等价于先去自环、把平行边合成一条后的基础无向可达关系。

把每个活跃区间分解为时间线段树的 O(log⁡(q+1)) 个规范节点。节点存放在它所代表的整个时间段内持续活跃的边;一条边可能出现在多个互不重叠的规范节点中,但任一时刻的根叶路径恰好覆盖它一次。

DFS 与回滚不变量 ​

深搜时间树时,进入节点前记录可回滚并查集快照,再把该节点的所有边 union。到达代表时刻 t 的叶子时,并查集恰含根叶路径上全部边,也就是 t 时的活跃图;此时用 Find 回答 query。离开节点前回滚到快照,保证一个时间分支的边不会泄漏到兄弟分支。

若产生 a 个非空活跃区间,每个区间进入 O(log⁡(q+1)) 个节点;按边实例配对时,a≤m0+ 插入次数。使用按大小合并、无路径压缩的 rollback DSU,Find 与 union 最坏为 O(log⁡(n+1))。计入 DSU 初始化和时间树遍历,主体时间为

O(n+(alog⁡(q+1)+q)log⁡(n+1)).

预处理的字典成本另计。若边身份已有稠密整数槽位,扫描和配对可线性完成;若需按端点对或任意 ID 建字典,平衡搜索树给出 O((m0+q)log⁡(m0+q+1)) 的确定性界,合适随机哈希条件下才可报告期望线性。简写为 O(qlog2⁡q) 还需 n,a=O(q)、q≥2 以及匹配的预处理条件。

直觉

删除之所以难,是因为普通并查集只会合并,不能把一条旧边从当前状态抽走。离线视角把“边何时存在”提升为一条时间区间:时间树把区间拆成若干完整覆盖块,DFS 进入块时加入边、离开块时撤销。于是数据结构始终只做擅长的合并与栈顶回滚,却能在每个叶子重现那个时刻的整张活跃图。

分治和线段树是同一时间递归的两种写法。显式线段树先保存规范节点;递归写法在区间中点处分配覆盖整个子问题的边,再把其余区间下放两个孩子。两者共享“根叶路径恰含当前时刻所有活跃边”的不变量。

活跃区间、时间树与回滚 DSU
例子与边界

重边与引用计数 ​

同一端点对可能连续添加两次,再只删除一次。若把端点对当作布尔状态,第一次删除就会错误地让边完全失活。可以按边 ID 分别配对,也可以维护端点对引用计数:计数从 0 变为 1 时开始一段连通图活跃区间,从 1 变为 0 时才结束;中间的增加和减少不改变“至少有一条边存在”这一连通事实。

采用栈配对时,remove 应弹出最近一次未匹配 add。若操作语义指定特定边 ID,就必须按该 ID 删除,不能用任意 LIFO 配对代替。删除不存在的边、扫描结束仍有未配对 add,以及闭区间/半开区间混用,都应在预处理阶段明确处理。

模型边界 ​

算法依赖预先知道未来删除时刻,是 offline 方法,不是在线 fully dynamic connectivity。半开区间 [l,r) 确保边在 remove 时刻已经失效;若误用闭区间,会多保留一次查询。该框架适合连通分量数、二分图 parity 等能随 union 增量维护且可回滚的摘要;带删除最短路没有同样的合并不变量,不能机械套用。

推论与应用

预处理保存每个边身份的 add 栈、a 个活跃区间和时间树节点列表,总空间为 O(alog⁡(q+1)+q+n+m0);DFS 同时存在的 DSU 历史只对应当前根叶路径上的成功合并与附加摘要。若每个分量还维护大小、奇偶势或权重和,union 时必须把所有被覆盖字段一并压入回滚记录。

离线动态连通常作为“时间分治 + 可撤销状态”的标杆:同一结构还能处理区间生效约束、批量版本验证和某些离线二分图查询。若更新必须到来即答,或需要最坏/摊还多对数更新时间,则要转向 Euler-tour tree、link-cut tree 或分层动态森林等在线结构;这些算法不能从本页的预知未来假设直接推出。

参考资料
  • David Eppstein, Zvi Galil, Giuseppe F. Italiano, and Amnon Nissenzweig, “Sparsification—A Technique for Speeding Up Dynamic Graph Algorithms,” Journal of the ACM 44(5), 1997, pp. 669–696.
  • Erik D. Demaine, Advanced Data Structures, MIT 6.851, Spring 2012, lecture notes on dynamic graphs, persistence, and rollback.
关系图谱11 个相邻概念 · 2 类关系

拖动节点调整位置。

显示关系

显示:依赖

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