Stoer-Wagner 算法

问题

求一个任意的无向图的全局最小割。即,定义 λ ( x , y ) \lambda(x,y) λ(x,y)表示 x , y x,y x,y两点之间的最小割,给出一张任意的无向图,你需要求出 min ⁡ x ≠ y λ ( x , y ) \min_{x\neq y}\lambda(x,y) minx=yλ(x,y)

Stoer-Wagner 算法

约定

w ( x , y ) w(x,y) w(x,y)表示 x , y x,y x,y之间的边权。用 c ( X , Y ) c(X,Y) c(X,Y)表示 ∑ x ∈ X , y ∈ Y w ( x , y ) \sum_{x\in X,y\in Y} w(x,y) xX,yYw(x,y),其中 X , Y X,Y X,Y是图中点集的两个子集。

定义contract(x,y)表示将 x , y x,y x,y两个点缩起来,具体来说就是新建一个点 u u u,对于任意 v ≠ x , v ≠ y v\neq x,v\neq y v=x,v=y,令 w ( u , v ) = w ( v , x ) + w ( v , y ) w(u,v) = w(v,x) + w(v,y) w(u,v)=w(v,x)+w(v,y),然后将 x , y x,y x,y从原图中删去。

算法过程

如果两个点在全局最小割的异侧,那么它们之间的最小割就是全局最小割;否则,将它们缩起来对全局最小割没有影响。

Stoer-Wagner算法的过程是:每一次求出两个点的最小割,然后把它们缩起来。整个算法过程中求出过的最小割的最小值就是全局最小割。

但是这样还是要求 n − 1 n-1 n1次最小割。

优化:MinimumCutPhase

我们并不是需要求某两个点之间的最小割,只要我们求出的是某两个点之间的最小割就可以了。

MinimumCutPhase可以在 O ( n 2 ) O(n^2) O(n2)的时间内求出某两个点之间的最小割,以下是它的过程:

  1. 首先随便选择一个点 a a a,令 A = { a } A=\{a\} A={a}
  2. 然后选择一个点不在 A A A中的点 x x x,使得 c ( A , { x } ) c(A,\{x\}) c(A,{x})最大,然后将 x x x加入 A A A
  3. 重复2.直到 A A A以外只剩下一个点。则我们最后加入 A A A的那个点和剩下的那个点(设为 z z z)之间的最小割就是 c ( A , { z } ) c(A,\{z\}) c(A,{z})

正确性:实际上可以证明,假设加入 A A A的点依次为 v 1 = a , v 2 ⋯ v n − 1 v_1=a,v_2\cdots v_{n-1} v1=a,v2vn1,令最后剩下的那个点为 v n v_n vn,那么对于任意的 i ≥ 2 i\ge 2 i2,在只考虑 v 1 , v 2 ⋯ v i v_1,v_2\cdots v_i v1,v2vi以及它们之间的边的时候, v i v_i vi v i − 1 v_{i-1} vi1之间的最小割是 c ( { v 1 , v 2 , ⋯ v i − 1 } , { v i } ) c(\{v_1,v_2,\cdots v_{i-1}\},\{v_i\}) c({v1,v2,vi1},{vi})

由于 v i , v i − 1 v_i,v_{i-1} vi,vi1的任意一个割都会删掉 ( v i , v i − 1 ) (v_i,v_{i-1}) (vi,vi1)这条边,所以 λ ( v i , v i − 1 ) \lambda(v_i,v_{i-1}) λ(vi,vi1)等于将 ( v i , v i − 1 ) (v_i,v_{i-1}) (vi,vi1)删掉之后求得的最小割 λ ′ ( v i , v i − 1 ) \lambda'(v_i,v_{i-1}) λ(vi,vi1)加上 w ( v i , v i − 1 ) w(v_i,v_{i-1}) w(vi,vi1)。所以接下来只考虑将 ( v i , v i − 1 ) (v_i,v_{i-1}) (vi,vi1)删掉后的图。

首先证明在只考虑 v 1 , v 2 , ⋯ v i v_1,v_2,\cdots v_i v1,v2,vi以及它们之间的边的时候, c ( { v 1 , v 2 , ⋯ v i − 1 } , { v i } ) ≤ λ ( v i − 1 , v i − 2 ) c(\{v_1,v_2,\cdots v_{i-1}\},\{v_i\})\le \lambda(v_{i-1},v_{i-2}) c({v1,v2,vi1},{vi})λ(vi1,vi2)。用归纳法。对于 i = 2 i=2 i=2显然成立。对于 i > 2 i>2 i>2

  • v i v_i vi以及与 v i v_i vi相邻的所有边从图中删掉,此时 v i − 1 v_{i-1} vi1 v i − 2 v_{i-2} vi2的最小割是 ( { v 1 , v 2 , ⋯ v i − 2 } , { v i − 1 } ) (\{v_1,v_2,\cdots v_{i-2}\},\{v_{i-1}\}) ({v1,v2,vi2},{vi1})(归纳假设)。
  • 由MinimumCutPhase的过程可以知道
    c ( { v 1 , v 2 ⋯ v i − 2 } , { v i } ) ≤ c ( { v 1 , v 2 , ⋯ v i − 2 } , { v i − 1 } ) (1) c(\{v_1,v_2\cdots v_{i-2}\},\{v_i\}) \le c(\{v_1,v_2,\cdots v_{i-2} \},\{v_{i-1}\}) \tag{1} c({v1,v2vi2},{vi})c({v1,v2,vi2},{vi1})(1)
  • 由于 v i v_i vi v i − 1 v_{i-1} vi1之间没有边,所以
    c ( { v 1 , v 2 , ⋯ v i − 2 } , { v i − 1 } ) = c ( { v 1 , v 2 , ⋯ v i − 2 , v i } , { v i − 1 } ) c ( { v 1 , v 2 ⋯ v i − 2 } , { v i } ) = c ( { v 1 , v 2 ⋯ v i − 2 , v i − 1 } , { v i } ) c(\{v_1,v_2,\cdots v_{i-2}\},\{v_{i-1}\}) = c( \{v_1,v_2,\cdots v_{i-2},v_i\},\{v_{i-1}\})\\ c(\{v_1,v_2\cdots v_{i-2}\},\{v_i\})= c(\{v_1,v_2\cdots v_{i-2},v_{i-1}\},\{v_i\}) c({v1,v2,vi2},{vi1})=c({v1,v2,vi2,vi},{vi1})c({v1,v2vi2},{vi})=c({v1,v2vi2,vi1},{vi})
  • 将上面的两个式子带入(1),可以得到
    c ( { v 1 , v 2 ⋯ v i − 2 , v i − 1 } , { v i } ) ≤ c ( { v 1 , v 2 , ⋯ v i − 2 , v i } , { v i − 1 } ) c(\{v_1,v_2\cdots v_{i-2},v_{i-1}\},\{v_i\}) \le c(\{v_1,v_2,\cdots v_{i-2},v_i \},\{v_{i-1}\}) c({v1,v2vi2,vi1},{vi})c({v1,v2,vi2,vi},{vi1})
  • 由于 c ( { v 1 , v 2 , ⋯ v i − 2 , v i } , { v i − 1 } ) c(\{v_1,v_2,\cdots v_{i-2},v_i \},\{v_{i-1}\}) c({v1,v2,vi2,vi},{vi1})等于加入 v i v_i vi这个点之前图中的 v i − 1 , v i − 2 v_{i-1},v_{i-2} vi1,vi2的最小割,并且在加入 v i v_i vi之后两个点的最小割不可能变得比加入之前更小,所以 c ( { v 1 , v 2 , ⋯ v i − 2 , v i } , { v i − 1 } ) = λ ( v i − 1 , v i − 2 ) c(\{v_1,v_2,\cdots v_{i-2},v_i \},\{v_{i-1}\})=\lambda(v_{i-1},v_{i-2}) c({v1,v2,vi2,vi},{vi1})=λ(vi1,vi2)。所以我们得到了
    c ( { v 1 , v 2 ⋯ v i − 2 , v i − 1 } , { v i } ) ≤ λ ( v i − 1 , v i − 2 ) c(\{v_1,v_2\cdots v_{i-2},v_{i-1}\},\{v_i\}) \le \lambda(v_{i-1},v_{i-2}) c({v1,v2vi2,vi1},{vi})λ(vi1,vi2)

然后我们将证明,只考虑 v 1 , v 2 , ⋯ v i v_1,v_2,\cdots v_i v1,v2,vi以及它们之间的边的时候, c ( { v 1 , v 2 , ⋯ v i − 1 } , { v i } ) ≤ λ ( v i , v i − 2 ) c(\{v_1,v_2,\cdots v_{i-1}\},\{v_i\})\le \lambda(v_{i},v_{i-2}) c({v1,v2,vi1},{vi})λ(vi,vi2)。用归纳法。对于 i = 2 i=2 i=2显然成立。对于 i > 2 i>2 i>2

  • 删去 v i − 1 v_{i-1} vi1以及原图中与它相邻的边。对得到的图重新进行MinimumCutPhase,最后加入 A A A的点是 v i − 2 v_{i-2} vi2,剩下的点是 v i v_i vi
  • 此时 v i , v i − 2 v_i,v_{i-2} vi,vi2之间的最小割是 c ( { v 1 , v 2 , ⋯ v i − 2 } , { v i } ) c(\{v_1,v_2,\cdots v_{i-2}\},\{v_i\}) c({v1,v2,vi2},{vi})
  • v i − 1 v_{i-1} vi1加回去之后的图中,得到 λ ( v i , v i − 2 ) = c ( { v 1 , v 2 , ⋯ v i − 2 , v i − 1 , v i } ) \lambda(v_i,v_{i-2}) = c(\{v_1,v_2,\cdots v_{i-2},v_{i-1},v_i\}) λ(vi,vi2)=c({v1,v2,vi2,vi1,vi})

综合以上两个结论:

c ( { v 1 , v 2 , ⋯ v i − 2 , v i − 1 } , { v i } ) = λ ( v i , v i − 2 ) c ( { v 1 , v 2 ⋯ v i − 2 , v i − 1 } , { v i } ) ≤ λ ( v i − 1 , v i − 2 ) ⟹ c ( { v 1 , v 2 , ⋯ v i − 1 } , { v i } ) ≤ min ⁡ { λ ( v i , v i − 1 ) , λ ( v i − 1 , v i − 2 } c(\{v_1,v_2,\cdots v_{i-2},v_{i-1}\},\{v_i\})=\lambda(v_i,v_{i-2})\\ c(\{v_1,v_2\cdots v_{i-2},v_{i-1}\},\{v_i\}) \le \lambda(v_{i-1},v_{i-2}) \\ \Longrightarrow c(\{v_1,v_2,\cdots v_{i-1}\},\{v_i\})\le \min\{\lambda(v_i,v_{i-1}),\lambda(v_{i-1},v_{i-2}\} c({v1,v2,vi2,vi1},{vi})=λ(vi,vi2)c({v1,v2vi2,vi1},{vi})λ(vi1,vi2)c({v1,v2,vi1},{vi})min{λ(vi,vi1),λ(vi1,vi2}

以及

λ ( x , y ) ≥ min ⁡ { λ ( y , z ) , λ ( x , z ) } \lambda(x,y) \ge \min \{ \lambda(y,z),\lambda(x,z)\} λ(x,y)min{λ(y,z),λ(x,z)}

以及
c ( { v 1 , v 2 , ⋯ v i − 1 } , { v i } ) ≥ λ ( v i , v i − 1 ) c(\{v_1,v_2,\cdots v_{i-1}\},\{v_i\}) \ge \lambda(v_i,v_{i-1}) c({v1,v2,vi1},{vi})λ(vi,vi1)

可以得到
c ( { v 1 , v 2 , ⋯ v i − 1 } , { v i } ) = λ ( v i , v i − 1 ) c(\{v_1,v_2,\cdots v_{i-1}\},\{v_i\}) = \lambda(v_i,v_{i-1}) c({v1,v2,vi1},{vi})=λ(vi,vi1)

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值