交互式图论学习
交互式图论学习
Guest User
Using app without sign in
最小割计算器
找到分离源和汇的最小容量边集
选择算法并生成步骤以开始可视化
最小割是这样一组代价最小的边:在流网络中移除它们会把汇点与源点断开。最大流最小割定理指出其容量等于最大流,因此计算其一即可解出另一。
在运行任意最大流算法之后,通过在残量图中找出仍从源点可达的所有顶点来恢复最小割;从该可达集合通向其余部分的每条满边都是割边。对于没有固定源汇的全局最小割,Stoer-Wagner 算法以 O(V 的三次方) 收缩顶点,Karger 的随机收缩则提供优雅的概率替代方案。
最小割可识别网络瓶颈与脆弱点、在计算机视觉中把图像分为前景与背景、在 VLSI 设计中划分电路,并度量社交网络中的社区边界。理解它与最大流的对偶关系是优秀算法候选人的标志。
最小割并不是直接算出来的。先求最大流,再在残量图上做一次遍历,把割读出来。
最小割(图, s, t):
先用任意最大流算法跑到饱和
// S = 在残量图中仍能从 s 抵达的全部结点
S = 从 s 出发做 BFS/DFS,只走
残量容量 > 0 的边
T = 其余全部结点
割 = { 原图中的边 (u,v) :
u 属于 S 且 v 属于 T }
返回该割以及这些边原始容量之和有两个事实使这一做法成立。任何从 S 跨到 T 的边都必然饱和,否则它的残量容量为正,其端点就会可达并因而落在 S 中。而任何从 T 回到 S 的边都不承载流量。于是跨越割的流量恰好等于割的容量;又因为任何流都不可能超过任何一个割,两者必定同时最优。
在与最大流示例相同的网络上求最小割:流饱和之后,直接读取残量图。
示例图: 有向容量 S 到 A (10)、S 到 B (10)、A 到 B (2)、A 到 T (4)、B 到 T (9)。
最小割是边对 A-T 与 B-T,总容量 13,与最大流 13 相等。注意 S-A 与 S-B 的容量合计为 20,它们同样构成一个割,只是更昂贵。瓶颈位于汇点一侧,而残量图上的这次遍历无需在候选割之间搜索就把它找了出来。
时间: 与所采用的最大流算法同阶 · 空间: O(V + E)
提取割本身只是一次 O(V + E) 的图遍历,可以忽略不计。全部开销都在它之前的最大流计算上:用 Edmonds-Karp 是 O(V 乘以 E 的平方),用 Dinic 是 O(V 的平方乘以 E)。这一点值得说清楚,因为它解释了为什么最小割不被当作一个独立问题来处理。目前没有任何已知方法能比计算最大流更快地渐进求出最小 s-t 割,因为按照最大流最小割定理,二者本就是同一个计算从相反两侧看过去的结果。
「割」这个词涵盖了好几个实质不同的问题。选错问题是这里最常见的失误。
| 替代算法 | 以下情况更合适 | 代价 |
|---|---|---|
| 最大流(Edmonds-Karp / Dinic) | 你要的是给定源点与汇点之间的最小 s-t 割。这是标准做法。 | O(V·E^2) 或 O(V^2·E) |
| Stoer-Wagner 算法 | 你要的是无向图的全局最小割,没有指定的源点与汇点。 | O(V·E + V^2·log V) |
| Karger 随机化算法 | 全局最小割,可以接受高概率正确的答案,且看重实现简单。 | 每次尝试 O(V^2) |
| Gomory-Hu 树 | 你需要许多不同点对之间的最小割。它用 V - 1 次最大流计算把它们全部编码下来。 | V - 1 次最大流计算 |