Skip to content

定义Definition

Low-link 值

Low-link value · Lowlink

DFS 子树通过树边和受允许的非树边能够到达的最早发现时间摘要。

形式陈述 ​

Low-link 是依赖具体 DFS 规则的发现时间摘要,不能脱离算法单独解释。先对有限无向图做深度优先搜索,令 tin[v] 为顶点 v 首次发现的编号。对无向图的桥与割点算法,low[v] 表示:从 v 沿零条或多条向下的树边,再沿至多一条非树边到达祖先,所能得到的最小发现编号;零长度路径保证 low[v]≤tin[v]。

初始化 low[v]=tin[v]。扫描边时,按下面两种情况更新:

  • 若邻点 w 尚未发现,递归处理后令 low[v]←min(low[v],low[w]),把整个子树的返回信息交给父节点。
  • 若 w 已发现,且这不是进入 v 的那一条父边,令 low[v]←min(low[v],tin[w])。若 w 是后代,其较大编号不会降低当前值。

在有向图的 Tarjan 强连通分量算法中,还要维护一个“尚未归入已完成分量”的顶点栈。初始化、树边回传同上;对已发现的邻点 w,只有 w 仍在这个栈中,才用 tin[w] 更新 low[v]。完成 v 的邻接扫描后,若 low[v]=tin[v],就从栈顶弹出直到 v,这批顶点构成一个强连通分量。这里的栈不等于递归调用栈:一个已经返回的 DFS 调用,其顶点仍可能等待所属分量一起出栈。

直觉

无向版本询问的是“这棵子树有没有另一条路通向上方”。父节点不必重新检查每个后代,只需接收一个最小编号。对树边 (u,v),若 low[v]>tin[u],子树无法绕过这条边回到 u 或其祖先,因此这条边是桥。

删顶点比删边更苛刻。若回边只能回到 u 本人,删除边 (u,v) 后仍可绕行,删除 u 后绕行出口却一起消失。因此非根 u 是割点,当且仅当存在树孩子 v 满足 low[v]≥tin[u]。DFS 根没有父方向可比较;它是割点,当且仅当有至少两个树孩子。

Low-link 回传与桥判据

图中回传的是无向桥判据的 low 值。Tarjan SCC 保留相似的最小值操作,但栈约束用于排除已经封闭的分量,不能从图中的“返祖”直觉直接省略该条件。

例子与边界

取无向边 ab,bc,ca,cd,从 a 开始按 a,b,c,d 发现,编号为 1,2,3,4。在 c 扫到非树边 ca 时,low[c] 从 3 降为 1;d 没有其他出口,故返回 low[d]=4。回溯得到 low[b]=1、low[a]=1。于是 cd 满足 4>3,是唯一桥;bc 不满足 1>2,不是桥。顶点 c 因孩子 d 满足 4≥3 成为割点,而根 a 只有一个 DFS 孩子,虽然图中有两条关联边,仍不是割点。

若只有 u,v 两点,却有两条平行边,DFS 用第一条到达 v,第二条提供返回 u 的另一条路。正确结果是 low[v]=tin[u],没有桥。若按“邻点等于父顶点”跳过两条边,就会误报;必须给边编号,只跳过实际父边的反向记录。

SCC 的栈区别也有具体后果。设有向边为 a→b,b→a,a→c,c→b,先搜索 b 再搜索 c。b 的调用已经返回,但因能回到 a,它尚未从分量栈弹出。此时 c→b 仍必须降低 low[c],最终三点一起出栈。反之,若先单独完成孤立点 b,随后搜索只有弧 c→b 的 c,b 已出栈,这条边不能让二者合成一个分量。

推论与应用

桥、割点、边双连通分量和强连通分量都可在邻接表上借助一次 DFS 的局部回传求得,时间为 O(|V|+|E|),辅助空间为 O(|V|)。共同点是避免对子树反复搜索;具体判据仍由各自的连通性问题决定。

若要真正输出点双连通边块,还需维护尚未归属的边栈:孩子返回满足 low[v]≥tin[u] 时,弹到进入该孩子的树边为止。不同块可以共享割点,每条边只归属一次;保存这条边栈及显式边块输出后,辅助空间与输出合计为 O(|V|+|E|),不再只有顶点状态。

这些值依赖当前边集和本次 DFS 树。全动态连通在边插删后维护生成森林和替代边,不能只改几个 low 值继续沿用原来的证明。支配树与 Lengauer–Tarjan 算法也使用 DFS 编号,但它问“所有入口路径是否必经某点”,与 low-link 记录“是否存在一条返回路线”有不同的量词和目标。

参考资料
关系图谱11 个相邻概念 · 3 类关系

拖动节点调整位置。

显示关系

显示:依赖

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