Stoer-Wagner算法求全局最小割
全局最小割可以用网络最大流来实现,也可以用Stoer-Wagner实现
先看几个概念
- S−T割:使得顶点S与顶点TT不再连通的割,称为S−T割
- S−T最小割:包含的弧的权和最小的S−T割,称为S−T最小割。
- 全局最小割:包含的弧的权和最小的割,称为全局最小割。
- 诱导割(induced cut):令图G=(V,E)的一个割为C,则割C在图G的子图G′=(V′,E′)中的部分称为割CC的诱导割
再看两个事实
- 两个顶点s,t 要么在全局最小割的一边,要么在两边,若s,t在全局最小割的两边,那么全局最小割就是S-T最小割
- 若s,t是位于全局最小割的两边,那么s,t合并成一个一点之后(不仅仅将两个点合并,相关的边也要合并)全局最小割变大(反证)
先看一下算法流程,然后再看证明。
- 初始化最小割 M I N = i n f MIN = inf MIN=inf
- 选一个初始点 a a a,加入集合 A A A中,也就是 A = { a } A=\{a\} A={ a}
- 设V为图中全部的节点,选择节点 x x x满足 a r g m a x x ∑ y w ( x , y ) x ∈ ( V − A ) , y ∈ A \underset{x}{argmax} \sum_yw(x,y)\quad x\in (V-A),y \in A xargmaxy∑w(x,y)x∈(V−A),y∈A然后将 x x x加入到 A A A中,,重复此过程,直到 ∣ A ∣ = ∣ V ∣ |A|=|V| ∣A∣=∣V∣
- 选择倒数第二个和倒数第一个加入到 A A A中的节点记作 s 、 t s、t s、t,最后求得的 ∑ x ∈ A w ( t , x ) \sum_{x \in A}w(t,x) ∑x∈Aw(t,x)就是 s − t s-t s−t最小割**(\默认是这样,一会儿证明 )**,令 M I N = m i n ( M I N , ∑ x ∈ A w ( t , x ) ) MIN = min(MIN, \sum_{x \in A}w(t,x)) MIN=min(MIN,∑x∈Aw(t,x))(注意此时 ∑ x ∈ A w ( t , x ) \sum_{x \in A}w(t,x) ∑x∈Aw(t,x)已经在第三步求出),合并s,t,返回步骤2直到 ∣ V ∣ = = 1 |V|==1 ∣V∣==1,也就是没有节点可以合并为止。
- 最后输出MIN,也就是最后的结果
那么我们此时注意我们的第5步,我们不管此时的 s − t s-t s−t最小割 ∑ x ∈ ( A − V ) w ( x , t ) \sum_{x \in (A-V)}w(x,t) ∑x∈(A−V)w(x,t)是不是全局最小割 (我们上面说过,若两个顶点s,t 要么在全局最小割的一边,要么在两边,若s,t在全局最小割的两边,那么全局最小割就是S-T最小割),如果不是的话,我们合并,如果是的话我们此时已经找到了,操作 M I N = m i n ( M I N , ∑ x ∈ A w ( t , x ) ) MIN = min(MIN, \sum_{x \in A}w(t,x)) MIN=min(MIN,∑x∈Aw(t,x))便得到这个值,然后我们的算法会仍然合并 s 、 t s、t s、t,根据事实2,我们直到接下来找的值一定不会比他小。
那么我们下面需要考虑的问题是我们步骤4当中这句话求得的 ∑ x ∈ A w ( t , x ) \sum_{x \in A}w(t,x) ∑x∈A