交互式图论学习
交互式图论学习
Guest User
Using app without sign in
割边(桥)查找器
找到移除后会增加连通分量的边
选择算法并生成步骤以开始可视化
桥(或割边)是这样一条边:移除它会使图断开。查找桥可定位网络的关键链路,即没有替代路径的连接。
一次深度优先搜索赋予发现时间和 low-link 值。边 (u, v)(其中 v 是 u 的 DFS 子结点)恰好在 low[v] > disc[u] 时是桥,意味着 v 的子树中没有任何东西能回连到 u 或更上层。所有桥都在 O(V + E) 内找到。相同的 DFS 框架也能得到割点,收缩 2-边连通分量则产生图的桥树。
桥揭示电信骨干网中的关键光纤链路、不可或缺的道路与铁路区段以及电网中的脆弱连接。在软件中,桥分析有助于评估 API 依赖风险。LeetCode 将其作为著名的关键连接问题。
与割点完全相同的机制,只是把其中一个比较由大于等于改成了严格大于。
dfs(u, 父结点):
disc[u] = low[u] = ++时间
对 u 的每个邻居 v:
若 v == 父结点: 跳过 // 跳过来时的那条边
若 v 已访问:
low[u] = min(low[u], disc[v]) // 回边
否则:
dfs(v, u)
low[u] = min(low[u], low[v])
若 low[v] > disc[u]:
报告边 (u, v) 是桥这个严格不等号就是它与割点的全部差别。low[v] > disc[u] 表示 v 之下的子树中没有任何东西能抵达 u 或 u 之上,因此边 (u, v) 是唯一的通路,删掉它就会让图断开。割点用的是 low[v] >= disc[u],其中取等意味着子树能抵达 u 本身但再上不去;这在你删掉结点 u 时会孤立该子树,但只删掉那条边时并不会。
在一个三角形加两条边尾巴的图上从 A 出发执行 DFS,这与割点示例使用的是同一个图,从而可以在完全相同的数据上对照两种判据。
示例图: 无向边 A-B、B-C、C-A 构成三角形,另有 C-D 与 D-E。
桥是 C-D 与 D-E。请注意它与同一个图上割点结果的对照:那里的答案是结点 C 和 D。三角形上的每条边都位于一个环上,因而都有绕行路线;而尾巴上的每条边都是通往其后一切的唯一连接。一般规律由此直接得出:一条边是桥,当且仅当它不位于任何环上。
时间: O(V + E) · 空间: O(V)
一次深度优先搜索,每条边只附加常数级的额外工作,因此代价就是遍历的代价。每个结点访问一次,每条边从两个端点各检查一次。状态是每个结点两个整数加上递归栈,全为 O(V)。朴素做法是逐条删边再检查连通性,代价为 O(E 乘以 (V + E));因此在一个有 10000 条边的图上,low-link 方法大约要快四个数量级。
同一次 DFS 能回答好几个相关问题。请根据脆弱的是一条边、一个结点还是一整片区域来选择。
| 替代算法 | 以下情况更合适 | 代价 |
|---|---|---|
| 割点 | 关键的是一个结点而非一条连接。同一次 DFS,判据为 low[v] >= disc[u]。 | O(V + E) |
| 桥树 / 边双连通分量 | 你要的是能在任意单条边失效后仍存续的区域,而不只是脆弱的边本身。 | O(V + E) |
| 在非桥边上使用并查集 | 你想把每个边双连通分量收缩成单个结点。 | O(E·α(V)) |
| 最小割 | 边带有容量,你要的是最便宜的断开边集,而不是单条边的失效点。 | 与最大流同阶 |