Stoer-Wagner算法学习笔记

SW算法是求全局最小割的一种O(n^3)算法,虽然可以用堆优化到O(n^2logn),但在稠密图上效果好像并不太好。

算法流程 :
1)设图G的min_cut=INF

2)设集合A为空集,w为累计权,随机选一个节点s,将s加入A,将所有与s相连的点i的wi加上s->i的边权

3)选出一个w值最大的不在A中的节点j加入s,将所有与j相连的点i的wi加上j->i的边权

4)如果|A|不等于|G|,执行3)

5)设最后加入的点为t,倒数第二个点为s,则s-t最小割为ws,用ws更新min_cut

6)将s,t缩成一个点,边也叠加到一起

7)如果|A|!=1,执行2),否则返回min_cut

自己看了下网上的证明,大多都是丢的paper,英文太渣看不懂。。。QAQ

然后自己就着自己的理解脑补了一下,说错别打我QAQ

首先我们考虑任意两个点为s,t,如果全局最小割中s,t不在一个集合中,那么显然全局最小割即为s-t最小割。否则我们将s,t缩成一个节点对于答案是没有影响的。

SW算法就是基于这一点,每次将问题规模减小后求解。以上还是很好理解的,但是为什么那样扩展节点就能保证是最小割呢?

我的理解是,一开始选择的节点是作为s-t的中间节点集,因为每次扩展是选取联系度最大的点扩展,所以中间节点集中点互相间的联系度是大于st到中间点集的联系度的,而最后加入的点t的联系度是最小的,所以最小割即为这个点的联系度,即为s通过中间节点集到t的流量加上s直接到t的流量。所以就证明了每次拓展求出的是s-t的最小割。

原文地址:https://www.cnblogs.com/ihopenot/p/5986772.html