Gomory-Hu Tree (最小割树)
基本定义
割 cut
对于一张带权无向图G=(V,E),定义一个割 (cut) 为两个集合S,T∈V,满足S∩T=∅,S∪T=V。定义一条边为割边 (cut edge) 当且仅当它的两个端点分别在S集合和T集合内。定义一个割的容量 (capacity of a cut) 为所有的割边的边权的和。
定义s-t割 (s-t cut) 为满足s∈S,t∈T的割。
流 flow
对于一张满足所有的边的容量c(u,v)(即u到v这条边的边权)非负的带权有向图G=(V,E),指定一个源点 (source)和汇点 (sink),则定义它的一个流网络 (flow network) 为一个映射f:V×V→R,满足以下三个性质:
- f(u,v)≤c(u,v)
- f(u,v)=−f(v,u)
- 对于任意u=s,u=t,满足∑x∈Vf(x,u)=∑x∈Vf(u,x)
最大流问题:找出一个从源点到汇点的可行流,使得该可行流的流量最大。
最大流最小割定理 max-flow min-cut theorem
最大流的流量等于最小割的容量。
符号 & 约定
对于G=(V,E),令W为V的一个子集,δ(W)表示所有恰好有一个端点在W以内的的边构成的集合。
则我们也可以用一个满足s∈W,t∈W的δ(W)来表示一个s−t割。我们用c(W)表示这个割的容量。
下文中均用f(u,v)表示u,v的最大流流量(也是最小割容量)。
一些引理
a)
设对于某一张带权图G,用f(u,v)表示从u到v的最大流(也等于最小割),则有:f(u,v)≥min{f(u,w),f(v,w)}。
b) symmetry
对于任意W⊆V,有c(W)=c(∁VW)。
c) submodularity
对于任意的A⊆V,B⊆A,v∈V,有c(A∪{v})−c(A)≥c(B∪{v})−c(B)。
推广:
- 令X⊆∁VA,则有c(A∪X)−c(A)≥c(B∪X)−c(B)。
- 对于任意A,B⊆V,有c(A)+c(B)≥c(A∪B)+c(A∩B)。证明:移项得到c(A)−c(A∩B)≥c(A∪B)−c(B),令U=A∩B,V=B,X=A∩∁VB,套用推广1可以得证。
d) posimodularity
对于任意A⊆V,B⊆V,有c(A)+c(B)≥c(A−B)+c(B−A),这里的A−B定义为A∩(∁VB)。
证明:
c(A)+c(B)=c(A)+c(∁VB)≥c(A∪∁VB)+c(A∩∁VB)=c(B∩∁VA)+c(A−B)=c(B−A)+c(A−B)
e)
令δ(W)为一个s,t的最小割,则对于任意u,v∈W,存在一个u,v最小割δ(X)满足X⊆W。
证明:
假设δ(X)为一个满足X,W有交且不包含的u,v最小割。下面不失一般性地只考虑s∈W,s∈X,u∈X的情况,因为其它情况都可以通过交换u,v或者将X变成∁VX的方式变成s∈W,s∈X,u∈X的情况。
情况1:t∈X。则有c(W)+c(X)≥c(W∪X)+c(W∩X)。由于u∈X,u∈W而v∈X,所以W∩X是一个u,v割,所以c(W∩X)≥c(X)。而由于t∈X,t∈W,所以W∪X是一个s,t割,所以c(W∪X)≥c(W)。由此可得c(W)+c(X)≤c(W∪X)+c(W∩X),故而c(W)=c(W∪X),c(X)=c(W∩X),所以X∩W也是u,v的最小割。
情况2:t∈X。则有c(W)+c(X)≥c(W−X)+c(X−W)。因为X−W是一个s,t割,所以c(X−W)≥c(W);又因为W−X是一个u,v割,所以c(W−X)≥c(X)。故而得到c(W−X)=c(X),c(X−W)=c(W),所以W−X也是u,v的最小割。
证毕。
Gomory-Hu Tree
定义
对于任意一张图G,它的Gomory-Hu tree是一棵生成树T,满足T中每条边(u,v),设割掉这条边之后得到的其中一个连通块是P,则(u,v)的边权为c(P),并且G中(u,v)的最小割为δ(P)。
构造算法
a)
我们维护V的一个划分{S1,S2⋯Sm}和一棵以{S1,S2⋯Sm}作为点集的生成树T,并用w′(Si,Sj)描述T中连接Si,Sj的边的边权。我们要使T始终满足:对于任意一条边(Si,Sj),存在a∈Si,b∈Sj满足f(a,b)=w′(Si,Sj),并且所对应的最小割割开了T上由(Si,Sj)分开的两个子树中的点构成的两个点集。
最初,我们令划分为{V}。
找出一个∣Si∣≥2的集合,从这个集合中任取两个点x,y,求出x,y的最小割。考虑这个最小割中包含x的点集X与包含y的点集Y,将Si划分成Six=Si∩X和Siy=Si∩Y,然后考虑原来的T中与Si相邻的点集Sj,如果Sj⊆X则让Sj与Six连边,否则若Sj⊆Y,就让Sj与Siy连边;根据前面的引理e),一定存在一个最小割使得Sj只与X,Y中的一个有交;边的边权为原来的T中的w′(Si,Sj)。
实现上,求最小割的时候,考虑T中删掉了Si之后得到的那些子树,把每个子树缩成一个点,对于某个点x与某个子树,x与这棵子树缩成的点之间的边权为x与这棵子树的所有点之间的边权的和,这样就可以得到一个满足Sj只与X,Y中的一个有交的最小割。
这样迭代n−1次就可以求出Gomory-Hu Tree。
b)
假设现在要求S这个点集的Gomory-Hu tree。任意选择两个点x,y∈S,求出x,y的最小割δ(X)。在x,y之间建边权为c(X)的边,然后将S分为X和∁SX,递归下去求解即可。
性质
考虑x,y两个点以及它们在T上的路径经过的点{p1,p2⋯pk}。
由于引理a),我们有f(x,y)≥min{f(x,p1),f(p1,p2)⋯f(pk−1,pk),f(pk,y)},也即是说f(x,y)大于等于它们在T的路径上的边权最小值。
另一方面,根据定义,T上将T的点集分成P和∁VP两部分的那条边,其边权等于c(P)。所以,x到y的路径上的每一条边所对应的割都是x−y割,所以x,y的最小割可以达到min{f(x,p1),f(p1,p2)⋯f(pk−1,pk),f(pk,y)}。
故而,G中任意两点的最小割等于它们在T之间的路径上的边权最小值。
参考资料
1 2