【学习笔记】无向图最小割

122 篇文章 0 订阅
27 篇文章 0 订阅

零、概述

什么离谱的人会研究这种离谱的东西啊……从定义,到构造,到性质,我完全想象不到 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:ER,注意边权一定非负。

是对图 G G G 的点集的划分 cut ( S ,    V ∖ S )    ( S ≠ ∅ ,    S ≠ V ) \text{cut}(S,\;V\setminus S)\;(S\ne\varnothing,\;S\ne V) cut(S,VS)(S=,S=V) 。用 cut ( S , T ) \text{cut}(S,T) cut(S,T) 表示一个割(即默认 S ∪ T = V S\cup T=V ST=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,jEc(i,j)[iS][jT] 表示这个 割的容量(割边的权值和)。

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 aS,bT

定义 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,cV,有 λ ( 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),,λ(ck1,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,BV 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(AB)+f(AB)

直观理解就是,元素越是聚集,贡献越小。

定理二:割的权函数 f ( S ) = ∣ cut ( S ,    V ∖ S ) ∣ f(S)=|\text{cut}(S,\;V\setminus S)| f(S)=cut(S,VS) 是子模函数。2

2.2. 对称函数

若定义在 V V V 的子集上的函数 f f f 满足如下性质,则其为 对称 函数:对于任意 S ⫅ V S\subseteqq V SV f ( S ) = f ( V ∖ S ) f(S)=f(V\setminus S) f(S)=f(VS)

定理三:割的权函数 f ( S ) = ∣ cut ( S ,    V ∖ S ) ∣ f(S)=|\text{cut}(S,\;V\setminus S)| f(S)=cut(S,VS) 是对称函数。

2.3. 反模函数

若定义在 V V V 的子集上的函数 f f f 满足如下性质,则其为 反模 posi-modular \text{posi-modular} posi-modular)函数:对于任意 A , B ⫅ V A,B\subseteqq V A,BV 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(AB)+f(BA)

定理四:若函数 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,VS) 是反模函数。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,vS,存在一个 u , v u,v u,v 的最小割 cut ( X , Y ) \text{cut}(X,Y) cut(X,Y) 使得 X ⫅ S X\subseteqq S XS Y ⫅ S Y\subseteqq S YS

也就是说,任取一个最小割 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 aX,因为 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,VS) 的性质。

  • b ∉ X b\notin X b/X,可以证明 X ∩ S X\cap S XS 与其补集也是 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(SX)+f(SX) 。然而 b ∉ S ∪ X b\notin S\cup X b/SX 说明 S ∪ X S\cup X SX 与其补集也是 b , a b,a b,a 的割,由最小割的定义 f ( S ∪ X ) ⩾ f ( S ) f(S\cup X)\geqslant f(S) f(SX)f(S) 。同理, u ∈ S ∩ X u\in S\cap X uSX 说明 f ( S ∩ X ) ⩾ f ( X ) f(S\cap X)\geqslant f(X) f(SX)f(X) 。于是三个不等式同时取等号。

  • b ∈ X b\in X bX,可以证明 S ∖ X S\setminus X SX 与其补集也是 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(SX)+f(XS) 。然而 v ∈ S ∖ X = S ∩ Y v\in S\setminus X=S\cap Y vSX=SY 说明 S ∖ X S\setminus X SX 与其补集是 v , u v,u v,u 的割,故 f ( S ∖ X ) ⩾ f ( X ) f(S\setminus X)\geqslant f(X) f(SX)f(X) 。同理, b ∈ X ∖ S = X ∩ T b\in X\setminus S=X\cap T bXS=XT 说明 f ( X ∖ S ) ⩾ f ( S ) f(X\setminus S)\geqslant f(S) f(XS)f(S) 。于是三个不等式同时取等号。

3. 构建算法

Gusfield \text{Gusfield} Gusfield 算法:对点集 S S S 建树,任取 a , b ∈ S a,b\in S a,bS 求出其最小割 cut ( X , Y ) \text{cut}(X,Y) cut(X,Y),注意这里 X ∪ Y = X\cup Y= XY= 原图 G G G,然后对 X ∩ S ,    Y ∩ S X\cap S,\;Y\cap S XS,YS 分别递归建树,最后连 ⟨ a , b ⟩ \langle a,b\rangle a,b 即可。

正确性证明:该算法为逐次加入边,只需证明每次加边的合法性,即 推论一 下方所说的,对于任意 u ∈ X ∩ S u\in X\cap S uXS v ∈ Y ∩ S v\in Y\cap S vYS
λ ( 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)foru2toVdofa(u)1foru2toVdovfa(u)w(u)solvecut(v,u)forxu+1toVdoiffa(x)=vandbel(x)=uthenfa(x)uE=foru2toVdoE=Efa(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(RV) 的最小割树,并让 G ∖ R G\setminus R GR 中的点找到归属。略显抽象。更形式化地,建出 R R R 的生成树,同时找到 V V V 的集合划分 C x    ( x ∈ R ) C_x\;(x\in R) Cx(xR) 使得:将这棵生成树上任意一条边 ⟨ a , b ⟩ \langle a,b\rangle a,b 删去,得到的树上连通块分别为 W W W R ∖ W R\setminus W RW,则 ⋃ i ∈ W C i \bigcup_{i\in W}C_i iWCi 与其在 G G G 中的补集是 a , b a,b a,b G G G 上的一个最小割。为了统一性,规定 x ∈ C x x\in C_x xCx

伪代码不能帮助理解,我还是直接讲吧。设现在正在处理上述问题。任取两不同点 a , b ∈ R a,b\in R a,bR,求出其在 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 RS 的最小割树、 G s G_s Gs R ∩ T R\cap T RT 的最小割树。因为点集无交,必然求出两棵独立的树,且可统一记录为 C x    ( x ∈ R ) C_x\;(x\in R) Cx(xR)

由定义,存在唯一的 r t ∈ R ∩ S r_t\in R\cap S rtRS 使得 t ∈ C r t t\in C_{r_t} tCrt,同理存在 s ∈ C r s s\in C_{r_s} sCrs 。加入一条最小割树的树边 ⟨ 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} tCrt 的特点,结合最小割树的 性质 可知 mincut ( a , r t ) \text{mincut}(a,r_t) mincut(a,rt) a ∈ C a a\in C_a aCa t ∈ C r t t\in C_{r_t} tCrt 割开了。将 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 xi,用 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 xCj,边应当为 ⟨ 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 uCi 的解 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,bV,若 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,,xV,其中 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({xV},{x1,x2,x3,,xV1}) x ∣ V ∣ − 1 , x ∣ V ∣ x_{|V|-1},x_{|V|} xV1,xV 的一个最小割。

1.2. 正确性证明

因为没什么可讲的了,只好把它单独设为一节

∣ V ∣ = 2 |V|=2 V=2 显然成立。下设 ∣ V ∣ ⩾ 3 |V|\geqslant 3 V3 。简记 n = ∣ V ∣ n=|V| n=V 。由于 mincut ( x n − 1 , x n ) \text{mincut}(x_{n-1},x_n) mincut(xn1,xn) 的割边必然包含 ⟨ x n − 1 , x n ⟩ \langle x_{n-1},x_n\rangle xn1,xn,我们可以先将其移除,最后加上其权值即得 λ ( x n − 1 , x n ) \lambda(x_{n-1},x_n) λ(xn1,xn)

若将 x n x_n xn 与其邻边移除,则得到的最大邻接搜索结果为 { x 1 , x 2 , … , x n − 1 } \{x_1,x_2,\dots,x_{n-1}\} {x1,x2,,xn1},由归纳法可知 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,,xn2},{xn1}) x n − 2 , x n − 1 x_{n-2},x_{n-1} xn2,xn1 在新图上的最小割。

现在将 x n x_n xn 放回来,割不可能变优。而 x n , x n − 1 x_n,x_{n-1} xn,xn1 之间的边已被删去,所以可以构造出 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,,xn2,xn},{xn1}) 让割的容量不变,所以这就是原图上 x n − 2 , x n − 1 x_{n-2},x_{n-1} xn2,xn1 的最小割。

由最大邻接搜索的过程知
∣ 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,,xn2},{xn1})cut({x1,x2,,xn2},{xn})

由于 x n − 1 , x n x_{n-1},x_n xn1,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,,xn2,xn},{xn1})cut({x1,x2,,xn1},{xn})

本节的开头已述,左式就是 x n − 1 , x n − 2 x_{n-1},x_{n-2} xn1,xn2 在原图上的最小割。于是
λ ( 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\})| λ(xn1,xn2)cut({x1,x2,,xn1},{xn})

类似地,将 x n − 1 x_{n-1} xn1 与其邻边移除再加入,由归纳法、构造可知
∣ 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,,xn1},{xn})=λ(xn2,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} λ(xn1,xn)min{λ(xn1,xn2),λ(xn2,n)}cut({x1,x2,,xn1},{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,,xn1},{xn}) 确实是 x n − 1 , x n x_{n-1},x_{n} xn1,xn 的一个割,所以上式必然取等。即,该割集就是 x n − 1 , x n x_{n-1},x_n xn1,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+VlogV),使用二叉堆(自行实现,支持单点修改)可以做到 O ( ∣ E ∣ log ⁡ ∣ V ∣ ) \mathcal O(|E|\log|V|) O(ElogV)

当然,这是针对单次 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} (2V)1 。没错,是一个非常小的数……需要运行 Θ ( ∣ V ∣ 2 ) \Theta(|V|^2) Θ(V2) 次才能让正确率变为某个常数。

缩点的实现又比较麻烦。边权相同(即不带权)时可以做到每次 O ( ∣ E ∣ ) \mathcal O(|E|) O(E),带权则只能做到 O ( ∣ E ∣ log ⁡ ∣ E ∣ ) \mathcal O(|E|\log|E|) O(ElogE),明显劣于 Stoer-Wagner \text{Stoer-Wagner} Stoer-Wagner 方法……而且还是非确定性……

肆、后记

作者能力十分有限,多数内容都是照搬论文,如有错误还请指出。


  1. 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 cS,则 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 cT 类似。 ↩︎

  2. 考虑将 f ( B ) f(B) f(B) B ∖ A B\setminus A BA 的部分移动到 f ( A ) f(A) f(A) 中,显然移动只会让割边减少,得到 f ( A ∪ B ) + f ( A ∩ B ) f(A\cup B)+f(A\cap B) f(AB)+f(AB)↩︎

  3. 简记 V ∖ S V\setminus S VS 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(BA)+f[V(ABˉ)]=f(BA)+f(AB)↩︎

  4. 事实上不用 定理四 也可证明,因为它等价于 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(AS)+f(BS),而这是容易说明的。 ↩︎

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值