什么离谱的人会研究这种离谱的东西啊……从定义,到构造,到性质,我完全想象不到 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 的 最小割的容量。
我在读论文时,发现一个问题是,我时常需要回头去看上面的叙述。此时夹杂的证明就成了一个阻碍。所以我将一部分证明放在了注脚中。
另:等价流树比最小割树更易理解(并且感觉更实用)所以我没有按照论文的顺序讲。
一颗 等价流树( 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) 为二者树上路径的最小边权。
据称,想到它的存在的原因是:两点间本质不同的最小割只有 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 的最小割亦不大于之。
若定义在 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
若定义在 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)∣ 是对称函数。
若定义在 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
核心定理:设 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)∣ 的性质。
由 子模函数
知 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) 。于是三个不等式同时取等号。
由 反模函数
知 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) 。于是三个不等式同时取等号。
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 的割,显然成立。
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} 表示这个割,返回值为割的权值。
核心定理
所揭示的,实际上是最小割之间的关系(而不仅仅是其容量)。有无可能造出一棵限制更强的等价流树呢?
一棵 最小割树( 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 的一个最小割。
我也不知道为什么英文名是那个奇怪的玩意儿诶。
若令边权为 λ \lambda λ,则最小割树是等价流树。这是毫无疑问的。
又因为最小割树的定义,可知 a , b a,b a,b 的最小割之一就是将二者树上路径最小边权的边删掉,获得的两个连通块作为割。
相较于等价流树,由 核心定理
,它所揭示的是,对于 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∣) 次求出最小割。
之所以称为引理,是因为太显然,根本不用证明,引用一遍就差不多得了。
同理,本算法也有循环模拟的方式,不过它更 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
伪代码中 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 ...
w[u] = w[v] // ... to , 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 可合并为一个点(二者之间的边不会割掉)。所以将二者合并,递归求全局最小割,不会漏解。
那么问题转化为,随便求出两个点的最小割。
这是一个异想天开的算法。与 p r i m \tt prim prim 或 d i j k s t r a \tt dijkstra dijkstra 可能有些许相似。
初始设点集 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∣ 的一个最小割。
因为没什么可讲的了,只好把它单独设为一节。
若 ∣ 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 的最小割。证毕。
不难发现,复杂度与 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∣) 次。
这个没什么意思,略讲:每次随机一条边,假定它不是全局最小割的割边,直接缩点。
通过计算,发现得到全局最小割的概率不小于 ( ∣ 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),而这是容易说明的。 ↩︎