零、概述
什么离谱的人会研究这种离谱的东西啊……从定义,到构造,到性质,我完全想象不到 i d e a \rm idea idea 的来源……
研究带权无向图上,任意两点之间的最小割。最朴素的方法是做 O ( n 2 ) \mathcal O(n^2) O(n2) 次网络流。
设图 G = ( V , E , c ) G=(V,E,c) G=(V,E,c) 为带权无向图,边的权值 是实值函数 c : E ↦ R ∗ c:E\mapsto\R^* c:E↦R∗,注意边权一定非负。
割 是对图 G G G 的点集的划分 cut ( S , V ∖ S ) ( S ≠ ∅ , S ≠ V ) \text{cut}(S,\;V\setminus S)\;(S\ne\varnothing,\;S\ne V) cut(S,V∖S)(S=∅,S=V) 。用 cut ( S , T ) \text{cut}(S,T) cut(S,T) 表示一个割(即默认 S ∪ T = V S\cup T=V S∪T=V 成立),用 ∣ cut ( S , T ) ∣ = ∑ ⟨ i , j ⟩ ∈ E c ( i , j ) [ i ∈ S ] [ j ∈ T ] |\text{cut}(S,T)|=\sum_{\langle i,j\rangle\in E}c(i,j)[i\in S][j\in T] ∣cut(S,T)∣=∑⟨i,j⟩∈Ec(i,j)[i∈S][j∈T] 表示这个 割的容量(割边的权值和)。
称 cut ( S , T ) \text{cut}(S,T) cut(S,T) 是 a , b a,b a,b 的割,当且仅当 a ∈ S , b ∈ T a\in S,\;b\in T a∈S,b∈T 。
定义 a , b a,b a,b 的 最小割 为容量最小的 a , b a,b a,b 的割,记为 mincut ( a , b ) \text{mincut}(a,b) mincut(a,b) 。由于名称较长,令 λ ( a , b ) = ∣ mincut ( a , b ) ∣ \lambda(a,b)=|\text{mincut}(a,b)| λ(a,b)=∣mincut(a,b)∣,即 a , b a,b a,b 的 最小割的容量。
壹、等价流树
我在读论文时,发现一个问题是,我时常需要回头去看上面的叙述。此时夹杂的证明就成了一个阻碍。所以我将一部分证明放在了注脚中。
另:等价流树比最小割树更易理解(并且感觉更实用)所以我没有按照论文的顺序讲。
1. 定义
一颗 等价流树( equivalent flow tree \text{equivalent flow tree} equivalent flow tree)满足,树上任意一条边 ⟨ a , b ⟩ \langle a,b\rangle ⟨a,b⟩ 的权值为 λ ( a , b ) \lambda(a,b) λ(a,b),且任意两点 u , v u,v u,v 满足 λ ( u , v ) \lambda(u,v) λ(u,v) 为二者树上路径的最小边权。
2. 存在性
据称,想到它的存在的原因是:两点间本质不同的最小割只有 n n n 个。但我完全不知道。
定理一:对于任意不同的三点 a , b , c ∈ V a,b,c\in V a,b,c∈V,有 λ ( a , b ) ⩾ min { λ ( a , c ) , λ ( c , b ) } \lambda(a,b)\geqslant\min\{\lambda(a,c),\lambda(c,b)\} λ(a,b)⩾min{λ(a,c),λ(c,b)} 。1
只要将 λ ( c , b ) \lambda(c,b) λ(c,b) 再用 min { λ ( c , d ) , λ ( d , b ) } \min\{\lambda(c,d),\lambda(d,b)\} min{λ(c,d),λ(d,b)} 放缩,很容易看出
推论一: λ ( a , b ) ⩾ min { λ ( a , c 1 ) , λ ( c 1 , c 2 ) , … , λ ( c k − 1 , c k ) , λ ( c k , b ) } \lambda(a,b)\geqslant\min\{\lambda(a,c_1),\lambda(c_1,c_2),\dots,\lambda(c_{k-1},c_k),\lambda(c_k,b)\} λ(a,b)⩾min{λ(a,c1),λ(c1,c2),…,λ(ck−1,ck),λ(ck,b)} 。
也就是说,如果能够建一棵 λ \lambda λ 为权值的树,那么 a , b a,b a,b 的最小割已经是不小于二者树上路径最小边权了;只需要证明 a , b a,b a,b 的最小割亦不大于之。
2.1. 子模函数
若定义在 V V V 的子集上的函数 f f f 满足如下性质,则其为 子模( submodular \text{submodular} submodular)函数:对于任意 A , B ⫅ V A,B\subseteqq V A,B⫅V 有 f ( A ) + f ( B ) ⩾ f ( A ∪ B ) + f ( A ∩ B ) f(A)+f(B)\geqslant f(A\cup B)+f(A\cap B) f(A)+f(B)⩾f(A∪B)+f(A∩B) 。
直观理解就是,元素越是聚集,贡献越小。
定理二:割的权函数 f ( S ) = ∣ cut ( S , V ∖ S ) ∣ f(S)=|\text{cut}(S,\;V\setminus S)| f(S)=∣cut(S,V∖S)∣ 是子模函数。2
2.2. 对称函数
若定义在 V V V 的子集上的函数 f f f 满足如下性质,则其为 对称 函数:对于任意 S ⫅ V S\subseteqq V S⫅V 有 f ( S ) = f ( V ∖ S ) f(S)=f(V\setminus S) f(S)=f(V∖S) 。
定理三:割的权函数 f ( S ) = ∣ cut ( S , V ∖ S ) ∣ f(S)=|\text{cut}(S,\;V\setminus S)| f(S)=∣cut(S,V∖S)∣ 是对称函数。
2.3. 反模函数
若定义在 V V V 的子集上的函数 f f f 满足如下性质,则其为 反模( posi-modular \text{posi-modular} posi-modular)函数:对于任意 A , B ⫅ V A,B\subseteqq V A,B⫅V 有 f ( A ) + f ( B ) ⩾ f ( A ∖ B ) + f ( B ∖ A ) f(A)+f(B)\geqslant f(A\setminus B)+f(B\setminus A) f(A)+f(B)⩾f(A∖B)+f(B∖A) 。
定理四:若函数 f f f 既是子模函数,又是对称函数,则 f f f 是反模函数。3
于是有了
推论二:割的权函数 f ( S ) = ∣ cut ( S , V ∖ S ) ∣ f(S)=|\text{cut}(S,\;V\setminus S)| f(S)=∣cut(S,V∖S)∣ 是反模函数。4
2.4. 核心定理
核心定理:设 a , b a,b a,b 的最小割是 cut ( S , T ) \text{cut}(S,T) cut(S,T),则对于任意不同的 u , v ∈ S u,v\in S u,v∈S,存在一个 u , v u,v u,v 的最小割 cut ( X , Y ) \text{cut}(X,Y) cut(X,Y) 使得 X ⫅ S X\subseteqq S X⫅S 或 Y ⫅ S Y\subseteqq S Y⫅S 。
也就是说,任取一个最小割 cut ( S , T ) \text{cut}(S,T) cut(S,T) 后, S S S 和 T T T 内部点对的最小割可以局限在 S , T S,T S,T 内部,提供了一个递归的结构。
证明:设 u , v u,v u,v 的某个最小割为 cut ( X , Y ) \text{cut}(X,Y) cut(X,Y) 。不失一般性地,设 a ∈ X a\in X a∈X,因为 u , v u,v u,v 可交换。接下来我们可以讨论一下 b b b 的位置。显然我们会需要用到割的权函数 f ( S ) = ∣ cut ( S , V ∖ S ) ∣ f(S)=|\text{cut}(S,\;V\setminus S)| f(S)=∣cut(S,V∖S)∣ 的性质。
- 若 b ∉ X b\notin X b∈/X,可以证明 X ∩ S X\cap S X∩S 与其补集也是 u , v u,v u,v 的最小割。
由 子模函数
知
f
(
S
)
+
f
(
X
)
⩾
f
(
S
∩
X
)
+
f
(
S
∪
X
)
f(S)+f(X)\geqslant f(S\cap X)+f(S\cup X)
f(S)+f(X)⩾f(S∩X)+f(S∪X) 。然而
b
∉
S
∪
X
b\notin S\cup X
b∈/S∪X 说明
S
∪
X
S\cup X
S∪X 与其补集也是
b
,
a
b,a
b,a 的割,由最小割的定义
f
(
S
∪
X
)
⩾
f
(
S
)
f(S\cup X)\geqslant f(S)
f(S∪X)⩾f(S) 。同理,
u
∈
S
∩
X
u\in S\cap X
u∈S∩X 说明
f
(
S
∩
X
)
⩾
f
(
X
)
f(S\cap X)\geqslant f(X)
f(S∩X)⩾f(X) 。于是三个不等式同时取等号。
- 若 b ∈ X b\in X b∈X,可以证明 S ∖ X S\setminus X S∖X 与其补集也是 v , u v,u v,u 的最小割。
由 反模函数
知
f
(
S
)
+
f
(
X
)
⩾
f
(
S
∖
X
)
+
f
(
X
∖
S
)
f(S)+f(X)\geqslant f(S\setminus X)+f(X\setminus S)
f(S)+f(X)⩾f(S∖X)+f(X∖S) 。然而
v
∈
S
∖
X
=
S
∩
Y
v\in S\setminus X=S\cap Y
v∈S∖X=S∩Y 说明
S
∖
X
S\setminus X
S∖X 与其补集是
v
,
u
v,u
v,u 的割,故
f
(
S
∖
X
)
⩾
f
(
X
)
f(S\setminus X)\geqslant f(X)
f(S∖X)⩾f(X) 。同理,
b
∈
X
∖
S
=
X
∩
T
b\in X\setminus S=X\cap T
b∈X∖S=X∩T 说明
f
(
X
∖
S
)
⩾
f
(
S
)
f(X\setminus S)\geqslant f(S)
f(X∖S)⩾f(S) 。于是三个不等式同时取等号。
3. 构建算法
Gusfield \text{Gusfield} Gusfield 算法:对点集 S S S 建树,任取 a , b ∈ S a,b\in S a,b∈S 求出其最小割 cut ( X , Y ) \text{cut}(X,Y) cut(X,Y),注意这里 X ∪ Y = X\cup Y= X∪Y= 原图 G G G,然后对 X ∩ S , Y ∩ S X\cap S,\;Y\cap S X∩S,Y∩S 分别递归建树,最后连 ⟨ a , b ⟩ \langle a,b\rangle ⟨a,b⟩ 即可。
正确性证明:该算法为逐次加入边,只需证明每次加边的合法性,即 推论一
下方所说的,对于任意
u
∈
X
∩
S
u\in X\cap S
u∈X∩S 和
v
∈
Y
∩
S
v\in Y\cap S
v∈Y∩S 有
λ
(
u
,
v
)
⩽
min
{
λ
(
u
,
a
)
,
λ
(
a
,
b
)
,
λ
(
b
,
v
)
}
\lambda(u,v)\leqslant\min\{\lambda(u,a),\lambda(a,b),\lambda(b,v)\}
λ(u,v)⩽min{λ(u,a),λ(a,b),λ(b,v)}
而根据 核心定理
,
λ
(
u
,
a
)
\lambda(u,a)
λ(u,a) 的一部可以被局限在
X
X
X 中,
λ
(
b
,
v
)
\lambda(b,v)
λ(b,v) 的一部可以被局限在
Y
Y
Y 中,所以二者都是
a
,
b
a,b
a,b 的一个割,由最小割的定义
λ
(
a
,
b
)
⩽
min
{
λ
(
u
,
a
)
,
λ
(
b
,
v
)
}
\lambda(a,b)\leqslant\min\{\lambda(u,a),\lambda(b,v)\}
λ(a,b)⩽min{λ(u,a),λ(b,v)} 。
于是只需判定 λ ( u , v ) ⩽ λ ( a , b ) \lambda(u,v)\leqslant\lambda(a,b) λ(u,v)⩽λ(a,b) 。由 cut ( X , Y ) \text{cut}(X,Y) cut(X,Y) 是 u , v u,v u,v 的割,显然成立。
4. 非递归实现
Gusfield
\text{Gusfield}
Gusfield 只是将点集不断细分的过程;那么我们可以应用类似并查集的思想,直接以循环模拟在
d
f
s
\tt dfs
dfs 树上进行广度优先搜索的过程。听上去很绕,不妨看伪代码。
Algorithm
Gusfield
(
V
,
E
)
1
for
u
←
2
to
∣
V
∣
do
2
f
a
(
u
)
←
1
3
for
u
←
2
to
∣
V
∣
do
4
v
←
f
a
(
u
)
5
w
(
u
)
←
solvecut
(
v
,
u
)
6
for
x
←
u
+
1
to
∣
V
∣
do
7
if
f
a
(
x
)
=
v
and
b
e
l
(
x
)
=
u
then
8
f
a
(
x
)
←
u
9
E
′
=
∅
10
for
u
←
2
to
∣
V
∣
do
11
E
′
=
E
′
∪
⟨
f
a
(
u
)
,
u
,
w
(
u
)
⟩
12
return
E
′
\begin{array}{r|l} & \textbf{Algorithm}\;\textrm{Gusfield}(V,E)\\ \hline 1 & \textbf{for}\;u\gets 2\;\textbf{to}\;|V|\;\textbf{do}\\ 2 & \quad fa(u)\gets 1\\ 3 & \textbf{for}\;u\gets 2\;\textbf{to}\;|V|\;\textbf{do}\\ 4 & \quad v\gets fa(u)\\ 5 & \quad w(u)\gets\textrm{solvecut}(v,u)\\ 6 & \quad\textbf{for}\;x\gets u{+}1\;\textbf{to}\;|V|\;\textbf{do}\\ 7 & \quad\quad\textbf{if}\;fa(x)=v\;\textbf{and}\;bel(x)=u\;\textbf{then}\\ 8 & \quad\quad\quad fa(x)\gets u\\ 9 & E'=\varnothing\\ 10 & \textbf{for}\;u\gets 2\;\textbf{to}\;|V|\;\textbf{do}\\ 11 & \quad E'=E'\cup\langle fa(u),u,w(u)\rangle\\ 12 & \textbf{return}\;E' \end{array}
123456789101112AlgorithmGusfield(V,E)foru←2to∣V∣dofa(u)←1foru←2to∣V∣dov←fa(u)w(u)←solvecut(v,u)forx←u+1to∣V∣doiffa(x)=vandbel(x)=uthenfa(x)←uE′=∅foru←2to∣V∣doE′=E′∪⟨fa(u),u,w(u)⟩returnE′
其中 solvecut \texttt{solvecut} solvecut 求出了 u , v u,v u,v 的最小割,用 b e l ( x ) ∈ { u , v } bel(x)\in\{u,v\} bel(x)∈{u,v} 表示这个割,返回值为割的权值。
贰、最小割树
核心定理
所揭示的,实际上是最小割之间的关系(而不仅仅是其容量)。有无可能造出一棵限制更强的等价流树呢?
1. 定义
一棵 最小割树( Gomory-Hu Tree \text{Gomory-Hu Tree} Gomory-Hu Tree)满足,若将树上任意一条边 ⟨ a , b ⟩ \langle a,b\rangle ⟨a,b⟩ 删去后得到的树的连通块为 S , T S,T S,T,则 cut ( S , T ) \text{cut}(S,T) cut(S,T) 是 a , b a,b a,b 的一个最小割。
我也不知道为什么英文名是那个奇怪的玩意儿诶。
2. 性质
若令边权为 λ \lambda λ,则最小割树是等价流树。这是毫无疑问的。
又因为最小割树的定义,可知 a , b a,b a,b 的最小割之一就是将二者树上路径最小边权的边删掉,获得的两个连通块作为割。
3. 构建算法
相较于等价流树,由 核心定理
,它所揭示的是,对于
a
,
b
a,b
a,b 的最小割
cut
(
S
,
T
)
\text{cut}(S,T)
cut(S,T),将
S
S
S 中的点对求
m
i
n
c
u
t
\rm mincut
mincut 时,可以将不含
b
b
b 的部分缩小到
S
S
S 内部。若直接将
a
,
b
a,b
a,b 连边,怎么保证递归建树的时候,
cut
\text{cut}
cut 中包含
b
b
b 的部分总是 “对准” 这条边的呢?
所以我们需要缩点。将 T T T 缩小成一个单点 t t t 。相当于让 S S S 内部的最小割强制局限于 S S S 中。但是又不用考虑这个虚点与别人的最小割,只需要考虑该虚点在最小割中的归属。
递归过程中,我们可能面临这样的问题——要建出图 G = ( V , E ) G=(V,E) G=(V,E) 上点集 R ( R ⫅ V ) R\;(R\subseteqq V) R(R⫅V) 的最小割树,并让 G ∖ R G\setminus R G∖R 中的点找到归属。略显抽象。更形式化地,建出 R R R 的生成树,同时找到 V V V 的集合划分 C x ( x ∈ R ) C_x\;(x\in R) Cx(x∈R) 使得:将这棵生成树上任意一条边 ⟨ a , b ⟩ \langle a,b\rangle ⟨a,b⟩ 删去,得到的树上连通块分别为 W W W 和 R ∖ W R\setminus W R∖W,则 ⋃ i ∈ W C i \bigcup_{i\in W}C_i ⋃i∈WCi 与其在 G G G 中的补集是 a , b a,b a,b 在 G G G 上的一个最小割。为了统一性,规定 x ∈ C x x\in C_x x∈Cx 。
伪代码不能帮助理解,我还是直接讲吧。设现在正在处理上述问题。任取两不同点 a , b ∈ R a,b\in R a,b∈R,求出其在 G G G 上的最小割 cut ( S , T ) \text{cut}(S,T) cut(S,T) 。令 G t G_t Gt 为,将 G G G 中 T T T 缩为一个点 t t t 的图;同理可记 G s G_s Gs 。
递归求出 G t G_t Gt 上 R ∩ S R\cap S R∩S 的最小割树、 G s G_s Gs 上 R ∩ T R\cap T R∩T 的最小割树。因为点集无交,必然求出两棵独立的树,且可统一记录为 C x ( x ∈ R ) C_x\;(x\in R) Cx(x∈R) 。
由定义,存在唯一的 r t ∈ R ∩ S r_t\in R\cap S rt∈R∩S 使得 t ∈ C r t t\in C_{r_t} t∈Crt,同理存在 s ∈ C r s s\in C_{r_s} s∈Crs 。加入一条最小割树的树边 ⟨ r t , r s ⟩ \langle r_t,r_s\rangle ⟨rt,rs⟩ 后,就得到了 R R R 上的生成树。
最后,由于 s , t s,t s,t 是不存在的点,将 C r s C_{r_s} Crs 中的 s s s 删去。同理也需删去 t t t 。然后过程终止。
递归出口 ∣ R ∣ = 1 |R|=1 ∣R∣=1 是平凡的,没有树边,直接令 C x = V ( R = { x } ) C_x=V\;(R=\{x\}) Cx=V(R={x}) 即可。
正确性证明:递归时求出的树边,其正确性犹存。因为我们无非是把
C
r
t
C_{r_t}
Crt 中的
t
t
t 进行了 “解压”,变成了树上的
T
T
T 部分,根据 核心定理
我们可以先把
T
T
T 压缩。
C
r
s
C_{r_s}
Crs 同理。那么只需检查
⟨
r
s
,
r
t
⟩
\langle r_s,r_t\rangle
⟨rs,rt⟩ 满足定义,即
cut
(
S
,
T
)
\text{cut}(S,T)
cut(S,T) 是
⟨
r
s
,
r
t
⟩
\langle r_s,r_t\rangle
⟨rs,rt⟩ 在
G
G
G 上的一个最小割。
首先
cut
(
S
,
T
)
\text{cut}(S,T)
cut(S,T) 是
⟨
r
s
,
r
t
⟩
\langle r_s,r_t\rangle
⟨rs,rt⟩ 的割,只需证明其最小,即
λ
(
a
,
b
)
⩽
λ
(
r
s
,
r
t
)
\lambda(a,b)\leqslant\lambda(r_s,r_t)
λ(a,b)⩽λ(rs,rt) 。运用
t
∈
C
r
t
t\in C_{r_t}
t∈Crt 的特点,结合最小割树的 性质
可知
mincut
(
a
,
r
t
)
\text{mincut}(a,r_t)
mincut(a,rt) 将
a
∈
C
a
a\in C_a
a∈Ca 与
t
∈
C
r
t
t\in C_{r_t}
t∈Crt 割开了。将
t
t
t 解压可知
mincut
(
a
,
r
t
)
\text{mincut}(a,r_t)
mincut(a,rt) 将
a
a
a 与
T
T
T 割开了。也就是说,
mincut
(
a
,
r
t
)
\text{mincut}(a,r_t)
mincut(a,rt) 是
a
,
b
a,b
a,b 的割,于是
λ
(
a
,
r
t
)
⩾
λ
(
a
,
b
)
\lambda(a,r_t)\geqslant\lambda(a,b)
λ(a,rt)⩾λ(a,b) 。同理
λ
(
b
,
r
s
)
⩾
λ
(
a
,
b
)
\lambda(b,r_s)\geqslant\lambda(a,b)
λ(b,rs)⩾λ(a,b) 。
根据 推论一
有
λ
(
r
t
,
r
s
)
⩾
min
{
λ
(
r
t
,
a
)
,
λ
(
a
,
b
)
,
λ
(
b
,
r
s
)
}
=
λ
(
a
,
b
)
\lambda(r_t,r_s)\geqslant\min\{\lambda(r_t,a),\lambda(a,b),\lambda(b,r_s)\}=\lambda(a,b)
λ(rt,rs)⩾min{λ(rt,a),λ(a,b),λ(b,rs)}=λ(a,b),证毕。
引理一:当 R = V R=V R=V 时,该函数将求出 G = ( V , E ) G=(V,E) G=(V,E) 的最小割树。
引理二:构建最小割树需要 Θ ( ∣ V ∣ ) \Theta(|V|) Θ(∣V∣) 次求出最小割。
之所以称为引理,是因为太显然,根本不用证明,引用一遍就差不多得了。
4. 非递归实现
同理,本算法也有循环模拟的方式,不过它更 t r i c k y \rm tricky tricky 。
对于 x ⩽ i x\leqslant i x⩽i,用 f a [ x ] fa[x] fa[x] 存储一条树边——即在 x x x 子集中找到 f a [ x ] ∈ C i fa[x]\in C_i fa[x]∈Ci,同理可找 x ∈ C j x\in C_j x∈Cj,边应当为 ⟨ i , j ⟩ \langle i,j\rangle ⟨i,j⟩ 而非二者直接相连。对于 i < x i<x i<x 用 f a [ x ] fa[x] fa[x] 表示归属关系。每次找到最小割之后,既要考虑改变归属关系,又要考虑 f a [ u ] = f a [ x ] fa[u]=fa[x] fa[u]=fa[x] 代表一条树边时,若 u u u 被划分到 x x x 一侧那么 u ∈ C i u\in C_i u∈Ci 的解 i i i 必然归属于 x x x,所以应连接代表树边的 f a [ u ] = x fa[u]=x fa[u]=x 。还要考虑 f a [ f a [ x ] ] fa[fa[x]] fa[fa[x]],其必然代表一条树边。
伪代码中 solvecut \texttt{solvecut} solvecut 会将所有 f a ≠ v fa\ne v fa=v 的点都根据 f a fa fa 进行缩点,然后求出最小割,返回值为容量。方案仍然用 b e l ∈ { u , v } bel\in\{u,v\} bel∈{u,v} 存储。
由于我累了,该伪代码就不用拉泰克书写了。
for i = 1 to |V| do
fa[i] = 1 // init
fa[1] = NULL // essential
for u = 2 to |V| do
var v = fa[u]
var omega = solve_cut(u,v) // (*)
for x = 1 to |V| do
if x != u and fa[x] = v and bel[x] == v then
fa[x] = u // (integrated)
end if
end for
if fa[v] != NULL and bel[fa[v]] == u then
fa[u] = fa[v] // edge on tree from <v,fa[v]> ...
w[u] = w[v] // ... to <u,fa[v]>, doing rotation
fa[v] = u
w[v] = omega
else
w[u] = omega // no change made
end if
end for
E = ∅
for u = 1 to |V| do
if fa[u] != NULL then
E = E ∪ (fa[u],u,w[u]) // endpoints and value
end if
end for
叁、全局最小割
由于是全局最小,我们可能不需要着眼于两个具体的点的最小割,也就可以不建出等价流树了。
首先有第一步转化:任取两个点 a , b ∈ V a,b\in V a,b∈V,若 a , b a,b a,b 在全局最小割的异侧,则 λ ( a , b ) \lambda(a,b) λ(a,b) 不超过全局最小割,根据定义 λ ( a , b ) \lambda(a,b) λ(a,b) 就等于全局最小割。当然,用 λ ( a , b ) \lambda(a,b) λ(a,b) 更新答案也肯定是合法解。若 a , b a,b a,b 在全局最小割的同侧,则 a , b a,b a,b 可合并为一个点(二者之间的边不会割掉)。所以将二者合并,递归求全局最小割,不会漏解。
那么问题转化为,随便求出两个点的最小割。
1. Stoer-Wagner \text{Stoer-Wagner} Stoer-Wagner 算法
这是一个异想天开的算法。与 p r i m \tt prim prim 或 d i j k s t r a \tt dijkstra dijkstra 可能有些许相似。
1.1. 最大邻接搜索
初始设点集 A = { x } A=\{x\} A={x},其中 x x x 是 V V V 中任意点。不断地找到 y ∉ A y\notin A y∈/A 使得 y y y 到 A A A 中所有点的边权之和最大,即 ∣ cut ( A , { y } ) ∣ |\text{cut}(A,\{y\})| ∣cut(A,{y})∣ 最大,将 y y y 加入 A A A 。当 A = V A=V A=V 时终止。
定理五:设 A A A 依次加入了 x 1 , x 2 , x 3 , … , x ∣ V ∣ x_1,x_2,x_3,\dots,x_{|V|} x1,x2,x3,…,x∣V∣,其中 x 1 x_1 x1 为初始值;则 cut ( { x ∣ V ∣ } , { x 1 , x 2 , x 3 , … , x ∣ V ∣ − 1 } ) \text{cut}(\{x_{|V|}\},\{x_1,x_2,x_3,\dots,x_{|V|-1}\}) cut({x∣V∣},{x1,x2,x3,…,x∣V∣−1}) 是 x ∣ V ∣ − 1 , x ∣ V ∣ x_{|V|-1},x_{|V|} x∣V∣−1,x∣V∣ 的一个最小割。
1.2. 正确性证明
因为没什么可讲的了,只好把它单独设为一节。
若 ∣ V ∣ = 2 |V|=2 ∣V∣=2 显然成立。下设 ∣ V ∣ ⩾ 3 |V|\geqslant 3 ∣V∣⩾3 。简记 n = ∣ V ∣ n=|V| n=∣V∣ 。由于 mincut ( x n − 1 , x n ) \text{mincut}(x_{n-1},x_n) mincut(xn−1,xn) 的割边必然包含 ⟨ x n − 1 , x n ⟩ \langle x_{n-1},x_n\rangle ⟨xn−1,xn⟩,我们可以先将其移除,最后加上其权值即得 λ ( x n − 1 , x n ) \lambda(x_{n-1},x_n) λ(xn−1,xn) 。
若将 x n x_n xn 与其邻边移除,则得到的最大邻接搜索结果为 { x 1 , x 2 , … , x n − 1 } \{x_1,x_2,\dots,x_{n-1}\} {x1,x2,…,xn−1},由归纳法可知 cut ( { x 1 , x 2 , … , x n − 2 } , { x n − 1 } ) \text{cut}(\{x_1,x_2,\dots,x_{n-2}\},\{x_{n-1}\}) cut({x1,x2,…,xn−2},{xn−1}) 是 x n − 2 , x n − 1 x_{n-2},x_{n-1} xn−2,xn−1 在新图上的最小割。
现在将 x n x_n xn 放回来,割不可能变优。而 x n , x n − 1 x_n,x_{n-1} xn,xn−1 之间的边已被删去,所以可以构造出 cut ( { x 1 , x 2 , … , x n − 2 , x n } , { x n − 1 } ) \text{cut}(\{x_1,x_2,\dots,x_{n-2},x_n\},\{x_{n-1}\}) cut({x1,x2,…,xn−2,xn},{xn−1}) 让割的容量不变,所以这就是原图上 x n − 2 , x n − 1 x_{n-2},x_{n-1} xn−2,xn−1 的最小割。
由最大邻接搜索的过程知
∣
cut
(
{
x
1
,
x
2
,
…
,
x
n
−
2
}
,
{
x
n
−
1
}
)
∣
⩾
∣
cut
(
{
x
1
,
x
2
,
…
,
x
n
−
2
}
,
{
x
n
}
)
∣
|\text{cut}(\{x_1,x_2,\dots,x_{n-2}\},\{x_{n-1}\})|\geqslant|\text{cut}(\{x_1,x_2,\dots,x_{n-2}\},\{x_n\})|
∣cut({x1,x2,…,xn−2},{xn−1})∣⩾∣cut({x1,x2,…,xn−2},{xn})∣
由于
x
n
−
1
,
x
n
x_{n-1},x_n
xn−1,xn 之间的边已被删去,上式等价于
∣
cut
(
{
x
1
,
x
2
,
…
,
x
n
−
2
,
x
n
}
,
{
x
n
−
1
}
)
⩾
∣
cut
(
{
x
1
,
x
2
,
…
,
x
n
−
1
}
,
{
x
n
}
)
∣
|\text{cut}(\{x_1,x_2,\dots,x_{n-2},x_n\},\{x_{n-1}\})\geqslant|\text{cut}(\{x_1,x_2,\dots,x_{n-1}\},\{x_n\})|
∣cut({x1,x2,…,xn−2,xn},{xn−1})⩾∣cut({x1,x2,…,xn−1},{xn})∣
本节的开头已述,左式就是
x
n
−
1
,
x
n
−
2
x_{n-1},x_{n-2}
xn−1,xn−2 在原图上的最小割。于是
λ
(
x
n
−
1
,
x
n
−
2
)
⩾
∣
cut
(
{
x
1
,
x
2
,
…
,
x
n
−
1
}
,
{
x
n
}
)
∣
\lambda(x_{n-1},x_{n-2})\geqslant|\text{cut}(\{x_1,x_2,\dots,x_{n-1}\},\{x_n\})|
λ(xn−1,xn−2)⩾∣cut({x1,x2,…,xn−1},{xn})∣
类似地,将
x
n
−
1
x_{n-1}
xn−1 与其邻边移除再加入,由归纳法、构造可知
∣
cut
(
{
x
1
,
x
2
,
…
,
x
n
−
1
}
,
{
x
n
}
)
∣
=
λ
(
x
n
−
2
,
x
n
)
|\text{cut}(\{x_1,x_2,\dots,x_{n-1}\},\{x_n\})|=\lambda(x_{n-2},x_n)
∣cut({x1,x2,…,xn−1},{xn})∣=λ(xn−2,xn)
由 定理一
我们知道
λ
(
x
n
−
1
,
x
n
)
⩾
min
{
λ
(
x
n
−
1
,
x
n
−
2
)
,
λ
(
x
n
−
2
,
n
)
}
⩾
∣
cut
(
{
x
1
,
x
2
,
…
,
x
n
−
1
}
,
{
x
n
}
)
∣
\begin{aligned} \lambda(x_{n-1},x_n) &\geqslant\min\{\lambda(x_{n-1},x_{n-2}),\lambda(x_{n-2},n)\}\\ &\geqslant|\text{cut}(\{x_1,x_2,\dots,x_{n-1}\},\{x_n\})| \end{aligned}
λ(xn−1,xn)⩾min{λ(xn−1,xn−2),λ(xn−2,n)}⩾∣cut({x1,x2,…,xn−1},{xn})∣
而 cut ( { x 1 , x 2 , … , x n − 1 } , { x n } ) \text{cut}(\{x_1,x_2,\dots,x_{n-1}\},\{x_n\}) cut({x1,x2,…,xn−1},{xn}) 确实是 x n − 1 , x n x_{n-1},x_{n} xn−1,xn 的一个割,所以上式必然取等。即,该割集就是 x n − 1 , x n x_{n-1},x_n xn−1,xn 的最小割。证毕。
1.3. 复杂度
不难发现,复杂度与 d i j k s t r a \tt dijkstra dijkstra 或 p r i m \tt prim prim 基本相同:使用斐波那契堆可以做到 O ( ∣ E ∣ + ∣ V ∣ log ∣ V ∣ ) \mathcal O(|E|+|V|\log|V|) O(∣E∣+∣V∣log∣V∣),使用二叉堆(自行实现,支持单点修改)可以做到 O ( ∣ E ∣ log ∣ V ∣ ) \mathcal O(|E|\log|V|) O(∣E∣log∣V∣) 。
当然,这是针对单次 Stoer-Wagner \text{Stoer-Wagner} Stoer-Wagner 的过程;求解全局最小割,我们统共要做 O ( ∣ V ∣ ) \mathcal O(|V|) O(∣V∣) 次。
2. Karger \text{Karger} Karger 算法
这个没什么意思,略讲:每次随机一条边,假定它不是全局最小割的割边,直接缩点。
通过计算,发现得到全局最小割的概率不小于 ( ∣ V ∣ 2 ) − 1 {|V|\choose 2}^{-1} (2∣V∣)−1 。没错,是一个非常小的数……需要运行 Θ ( ∣ V ∣ 2 ) \Theta(|V|^2) Θ(∣V∣2) 次才能让正确率变为某个常数。
缩点的实现又比较麻烦。边权相同(即不带权)时可以做到每次 O ( ∣ E ∣ ) \mathcal O(|E|) O(∣E∣),带权则只能做到 O ( ∣ E ∣ log ∣ E ∣ ) \mathcal O(|E|\log|E|) O(∣E∣log∣E∣),明显劣于 Stoer-Wagner \text{Stoer-Wagner} Stoer-Wagner 方法……而且还是非确定性……
肆、后记
作者能力十分有限,多数内容都是照搬论文,如有错误还请指出。
设 mincut ( a , b ) = cut ( S , T ) \text{mincut}(a,b)=\text{cut}(S,T) mincut(a,b)=cut(S,T),若 c ∈ S c\in S c∈S,则 cut ( S , T ) \text{cut}(S,T) cut(S,T) 同样是 c , b c,b c,b 的割,故而 λ ( c , b ) ⩽ λ ( a , b ) \lambda(c,b)\leqslant\lambda(a,b) λ(c,b)⩽λ(a,b) 。 c ∈ T c\in T c∈T 类似。 ↩︎
考虑将 f ( B ) f(B) f(B) 中 B ∖ A B\setminus A B∖A 的部分移动到 f ( A ) f(A) f(A) 中,显然移动只会让割边减少,得到 f ( A ∪ B ) + f ( A ∩ B ) f(A\cup B)+f(A\cap B) f(A∪B)+f(A∩B) 。 ↩︎
简记 V ∖ S V\setminus S V∖S 为 S ˉ \bar S Sˉ,则 f ( A ) + f ( B ) = f ( A ˉ ) + f ( B ) ⩾ f ( A ˉ ∩ B ) + f ( A ˉ ∪ B ) = f ( B ∖ A ) + f [ V ∖ ( A ∩ B ˉ ) ] = f ( B ∖ A ) + f ( A ∖ B ) f(A)+f(B)=f(\bar A)+f(B)\geqslant f(\bar A\cap B)+f(\bar A\cup B)=f(B\setminus A)+f[V\setminus(A\cap\bar B)]=f(B\setminus A)+f(A\setminus B) f(A)+f(B)=f(Aˉ)+f(B)⩾f(Aˉ∩B)+f(Aˉ∪B)=f(B∖A)+f[V∖(A∩Bˉ)]=f(B∖A)+f(A∖B) 。 ↩︎
事实上不用
定理四
也可证明,因为它等价于 A , B , S A,B,S A,B,S 两两不交时 f ( A ) + f ( B ) ⩽ f ( A ∪ S ) + f ( B ∪ S ) f(A)+f(B)\leqslant f(A\cup S)+f(B\cup S) f(A)+f(B)⩽f(A∪S)+f(B∪S),而这是容易说明的。 ↩︎