问题
求一个任意的无向图的全局最小割。即,定义 λ ( 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) ∑x∈X,y∈Yw(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 n−1次最小割。
优化:MinimumCutPhase
我们并不是需要求某两个点之间的最小割,只要我们求出的是某两个点之间的最小割就可以了。
MinimumCutPhase可以在 O ( n 2 ) O(n^2) O(n2)的时间内求出某两个点之间的最小割,以下是它的过程:
- 首先随便选择一个点 a a a,令 A = { a } A=\{a\} A={a}。
- 然后选择一个点不在 A A A中的点 x x x,使得 c ( A , { x } ) c(A,\{x\}) c(A,{x})最大,然后将 x x x加入 A A A。
- 重复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,v2⋯vn−1,令最后剩下的那个点为 v n v_n vn,那么对于任意的 i ≥ 2 i\ge 2 i≥2,在只考虑 v 1 , v 2 ⋯ v i v_1,v_2\cdots v_i v1,v2⋯vi以及它们之间的边的时候, v i v_i vi和 v i − 1 v_{i-1} vi−1之间的最小割是 c ( { v 1 , v 2 , ⋯ v i − 1 } , { v i } ) c(\{v_1,v_2,\cdots v_{i-1}\},\{v_i\}) c({v1,v2,⋯vi−1},{vi})。
由于 v i , v i − 1 v_i,v_{i-1} vi,vi−1的任意一个割都会删掉 ( v i , v i − 1 ) (v_i,v_{i-1}) (vi,vi−1)这条边,所以 λ ( v i , v i − 1 ) \lambda(v_i,v_{i-1}) λ(vi,vi−1)等于将 ( v i , v i − 1 ) (v_i,v_{i-1}) (vi,vi−1)删掉之后求得的最小割 λ ′ ( v i , v i − 1 ) \lambda'(v_i,v_{i-1}) λ′(vi,vi−1)加上 w ( v i , v i − 1 ) w(v_i,v_{i-1}) w(vi,vi−1)。所以接下来只考虑将 ( v i , v i − 1 ) (v_i,v_{i-1}) (vi,vi−1)删掉后的图。
首先证明在只考虑 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,⋯vi−1},{vi})≤λ(vi−1,vi−2)。用归纳法。对于 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} vi−1和 v i − 2 v_{i-2} vi−2的最小割是 ( { v 1 , v 2 , ⋯ v i − 2 } , { v i − 1 } ) (\{v_1,v_2,\cdots v_{i-2}\},\{v_{i-1}\}) ({v1,v2,⋯vi−2},{vi−1})(归纳假设)。
- 由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,v2⋯vi−2},{vi})≤c({v1,v2,⋯vi−2},{vi−1})(1) - 由于
v
i
v_i
vi和
v
i
−
1
v_{i-1}
vi−1之间没有边,所以
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,⋯vi−2},{vi−1})=c({v1,v2,⋯vi−2,vi},{vi−1})c({v1,v2⋯vi−2},{vi})=c({v1,v2⋯vi−2,vi−1},{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,v2⋯vi−2,vi−1},{vi})≤c({v1,v2,⋯vi−2,vi},{vi−1}) - 由于
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,⋯vi−2,vi},{vi−1})等于加入
v
i
v_i
vi这个点之前图中的
v
i
−
1
,
v
i
−
2
v_{i-1},v_{i-2}
vi−1,vi−2的最小割,并且在加入
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,⋯vi−2,vi},{vi−1})=λ(vi−1,vi−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\cdots v_{i-2},v_{i-1}\},\{v_i\}) \le \lambda(v_{i-1},v_{i-2}) c({v1,v2⋯vi−2,vi−1},{vi})≤λ(vi−1,vi−2)
然后我们将证明,只考虑 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,⋯vi−1},{vi})≤λ(vi,vi−2)。用归纳法。对于 i = 2 i=2 i=2显然成立。对于 i > 2 i>2 i>2:
- 删去 v i − 1 v_{i-1} vi−1以及原图中与它相邻的边。对得到的图重新进行MinimumCutPhase,最后加入 A A A的点是 v i − 2 v_{i-2} vi−2,剩下的点是 v i v_i vi。
- 此时 v i , v i − 2 v_i,v_{i-2} vi,vi−2之间的最小割是 c ( { v 1 , v 2 , ⋯ v i − 2 } , { v i } ) c(\{v_1,v_2,\cdots v_{i-2}\},\{v_i\}) c({v1,v2,⋯vi−2},{vi})。
- 把 v i − 1 v_{i-1} vi−1加回去之后的图中,得到 λ ( 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,vi−2)=c({v1,v2,⋯vi−2,vi−1,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,⋯vi−2,vi−1},{vi})=λ(vi,vi−2)c({v1,v2⋯vi−2,vi−1},{vi})≤λ(vi−1,vi−2)⟹c({v1,v2,⋯vi−1},{vi})≤min{λ(vi,vi−1),λ(vi−1,vi−2}
以及
λ ( 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,⋯vi−1},{vi})≥λ(vi,vi−1)
可以得到
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,⋯vi−1},{vi})=λ(vi,vi−1)