Gomory-Hu Tree \text{Gomory-Hu Tree} Gomory-Hu Tree 最小割树
定义
每条边 ( u , v ) (u,v) (u,v)两边的点集表示一个 ( u , v ) (u,v) (u,v)的最小割。点集表示一个最小割的割集(方案)性质使 最小割树 区别于 等价流树
重要定理
对
(
s
,
t
)
(s,t)
(s,t)的一个最小割
C
u
t
(
W
,
V
−
W
)
Cut(W,V-W)
Cut(W,V−W),有
∀
u
,
v
∈
W
,
∃
X
⊆
W
,
C
u
t
(
X
,
V
−
X
)
=
c
u
t
(
u
,
v
)
\large \forall u,v\in W,\exist X\subseteq W,Cut(X,V-X)=cut(u,v)
∀u,v∈W,∃X⊆W,Cut(X,V−X)=cut(u,v)
-
引理:设 f ( S ) = C u t ( S , V − S ) f(S)=Cut(S,V-S) f(S)=Cut(S,V−S),则函数满足
f ( A ) + f ( B ) ≥ f ( A ∩ B ) + f ( A ∪ B ) f ( A ) + f ( B ) ≥ f ( A \ B ) + f ( B \ A ) \large f(A)+f(B)\geq f(A\cap B)+f(A\cup B)\\ \large f(A)+f(B)\geq f(A\backslash B)+f(B\backslash A) f(A)+f(B)≥f(A∩B)+f(A∪B)f(A)+f(B)≥f(A\B)+f(B\A) -
证明
不妨设 s , u ∈ X s,u\in X s,u∈X 。
讨论一下,
当 t ∉ X \large t\notin X t∈/X ,
f ( X ∩ W ) ≥ f ( X ) , f ( X ∪ W ) ≥ f ( W ) ⇒ f ( X ∩ W ) = f ( X ) , f ( X ∪ W ) = f ( W ) \large f(X\cap W)\geq f(X), \large f(X\cup W)\geq f(W)\\ \large \Rightarrow \large f(X\cap W)= f(X), \large f(X\cup W)= f(W) f(X∩W)≥f(X),f(X∪W)≥f(W)⇒f(X∩W)=f(X),f(X∪W)=f(W)
这里 X ∩ W ⊆ W X\cap W \subseteq W X∩W⊆W 且是满足条件的割。若 t ∈ X \large t\in X t∈X,
f ( X \ W ) ≥ f ( W ) , f ( W \ X ) ≥ f ( X ) ⇒ f ( X \ W ) = f ( W ) , f ( W \ X ) = f ( X ) \large f(X\backslash W)\geq f(W),f(W\backslash X)\geq f(X)\\ \large \Rightarrow f(X\backslash W)= f(W),f(W\backslash X)= f(X) f(X\W)≥f(W),f(W\X)≥f(X)⇒f(X\W)=f(W),f(W\X)=f(X)
这里 W \ X ⊆ W W\backslash X \subseteq W W\X⊆W 且是满足条件的割。
引理
λ ( a , b ) \lambda(a,b) λ(a,b) 即 c u t ( a , b ) cut(a,b) cut(a,b).有
λ ( a , c ) ≥ min ( λ ( a , b ) , λ ( b , c ) ) \lambda(a,c)\geq \min(\lambda(a,b),\lambda(b,c)) λ(a,c)≥min(λ(a,b),λ(b,c))
⇒ λ ( a 1 , a n ) ≥ min λ ( a i , a i + 1 ) , i = 1 … n − 1 \Rightarrow \lambda(a_1,a_n)\geq \min \lambda(a_i,a_{i+1}),i=1\dots n-1 ⇒λ(a1,an)≥minλ(ai,ai+1),i=1…n−1
做法
随机选两点求最小割,在树上连接两点,把图分为两个点集,递归处理。可以得到一棵树。 O ( n 3 m ) O(n^3m) O(n3m) — dinic / ISAP。(X)
- 事实上并没有那么简单。。
- 发现,当前的连边确定后,之后不能方便地找到合法的连边。
- 于是乎,有了这样的想法 — 暂时不定下连边,而仍利用求出的两个割集进行划分递归,最后再用巧妙的方法合并两棵最小割树。
- 先说明一种递归的思路 ;再把它简单地实现为非递归版本。
- 求
G
0
G_0
G0 的最小割树。递归ver:
- 定义递归函数 — 参数有一个图 G = ( V , E ) G=(V,E) G=(V,E)、一个点集 R ⊆ V R\subseteq V R⊆V 。
- 返回值为"最小割树"(重定义) — 一个二元组 ( T , C ) (T,C) (T,C);其中 T = ( R , E T ) T=(R,E_T) T=(R,ET) 为一棵点集为 R R R 的树, C = ( C r ∣ r ∈ R ) C=(C_r|r\in R) C=(Cr∣r∈R) 为集合 V V V 的一个划分 — 将 V V V 中的每个点并入 T T T 中的一个点;也即 将 V V V中的点缩点并建树,且每个大点以一个 R R R 中的点为“代表点”。
- 这棵树需要满足:对任意边 ( i , j ) ∈ E T (i,j)\in E_T (i,j)∈ET,删去此边后,树 T T T 被分为 X , R − X X,R-X X,R−X两个集合,则 c u t ( i , j ) G = C u t ( ⋃ r ∈ X C r ) \large cut(i,j)_G=Cut(\bigcup_{r\in X}C_r) cut(i,j)G=Cut(⋃r∈XCr),这与原最小割树定义类似;当 G = G 0 , R = V G=G_0,R=V G=G0,R=V ,此树即为所求;当 ∣ R ∣ = 1 |R|=1 ∣R∣=1 ,则直接返回。
- 设我们一开始做最小割的点分别为 u 1 , u 2 ∈ R u_1,u_2\in R u1,u2∈R ,它们分属割集 W , V − W W,V-W W,V−W 。
- 递归到 ( G 1 = ( V 1 , E 1 ) , R 1 = R ∩ W ) , ( G 2 = ( V 2 , E 2 ) , R 2 = R ∩ ( V − W ) ) (G_1=(V_1,E_1),R_1=R\cap W),(G_2=(V_2,E_2),R_2=R\cap(V-W)) (G1=(V1,E1),R1=R∩W),(G2=(V2,E2),R2=R∩(V−W)) 可以得到两棵树 ( T 1 , C 1 ) , ( T 2 , C 2 ) (T_1,C_1),(T_2,C_2) (T1,C1),(T2,C2)。我们希望合并时尽量利用好两棵树,不做大改动。由重要定理,一个割集不会影响另一割集的最小割,这给了我们忽略另一割集往下递归的可能性。然而,为保证合并后的 割集性质,显然需要将另一割集缩点放入这一割集递归的参数图G中,即 V 1 = X + v 1 , V 2 = V − X + v 2 V_1=X+v_1,V_2=V-X+v_2 V1=X+v1,V2=V−X+v2,其中 V − X → v 1 , X → v 2 V-X \rightarrow v_1,X \rightarrow v_2 V−X→v1,X→v2。
- 再考虑合并 —
- 有一种比较自然的想法 — 将 v 1 , v 2 v_1,v_2 v1,v2 所在的两个大点 的“代表点”( x 1 , x 2 x_1,x_2 x1,x2) 相连(边权为最开始求的割)。通过上面的叙述,不难理解新树中原来两颗树上的边依然符合 割集性质 ,只要再说明新边的 割集性质( c u t ( x 1 , x 2 ) G = f ( W ) = c u t ( u 1 , u 2 ) cut(x_1,x_2)_G=f(W)=cut(u_1,u_2) cut(x1,x2)G=f(W)=cut(u1,u2)) 即可。
- W W W 为一个 x 1 , x 2 x_1,x_2 x1,x2 的割( x 1 ∈ W x_1\in W x1∈W),故 c u t ( x 1 , x 2 ) ≤ f ( W ) cut(x_1,x_2)\leq f(W) cut(x1,x2)≤f(W) 成立。再证 c u t ( x 1 , x 2 ) ≥ c u t ( u 1 u 2 ) cut(x_1,x_2)\geq cut(u_1u_2) cut(x1,x2)≥cut(u1u2)。
- 假设 x 1 ≠ u 1 , x 2 ≠ u 2 x_1\neq u_1,x_2\neq u_2 x1=u1,x2=u2,相等时证明类似。
- 可以通过 引理 把左右式巧妙联系起来 c u t ( x 1 , x 2 ) ≥ min ( c u t ( x 1 , u 1 ) , c u t ( u 1 , u 2 ) , c u t ( u 2 , x 2 ) ≥ c u t ( u 1 , u 2 ) \large cut(x_1,x_2)\geq \min(cut(x_1,u_1),cut(u_1,u_2),cut(u_2,x_2)\geq cut(u_1,u_2) cut(x1,x2)≥min(cut(x1,u1),cut(u1,u2),cut(u2,x2)≥cut(u1,u2),下证 c u t ( x 1 , u 1 ) ≥ c u t ( u 1 , u 2 ) cut(x_1,u_1)\geq cut(u_1,u_2) cut(x1,u1)≥cut(u1,u2)。
- 取 T 1 T_1 T1 上一条代表了 x 1 , u 1 x_1,u_1 x1,u1 最小割方案的边,由于 u 2 u_2 u2 被缩点进入 v 1 ∈ C x 1 v_1\in C_{x_1} v1∈Cx1,所以此方案也代表一种 u 1 , u 2 u_1,u_2 u1,u2 的割,故上式满足。
- 合并正确性 证毕。
- 非递归ver:我们可以发现上述递归过程并不依赖于兄弟层的递归结果,只与上一层划分下来的图有关。于是一种“bfs型”随机访问处理法诞生。
- 下面的叙述将在叙述做法的同时,解释其与原递归方式的联系,也就说明了正确性。
- 我们通过维护一个 fa 数组,同时处理 最小割树中 E T E_T ET 中的边,以及 作为一个并查集边 维护某个 R R R 。这样构成了一棵树。
- 把点标记为两类。黑点的 fa 代表 边 ( f a i , i ) (fa_i,i) (fai,i)两边的集合在某次向下递归中被划分开;白点的 fa 即并查集的 fa。
- 初始状态即,所有点染白,fa 都指向 1,1点染黑。全部点染黑后,所得即最小割树。
- 每次找到一个白点 i, f a i fa_i fai为黑点, i , f a i i,fa_i i,fai 即为可行的一对 u 1 , u 2 u_1,u_2 u1,u2 –
- 对它们做最小割。做最小割时,缩点就把 f a i fa_i fai 的黑儿子的子树、 f a i fa_i fai子树外的部分 分别缩点。
- 接下来,对所有
x
(
f
a
x
=
f
a
i
)
x(fa_x=fa_i)
x(fax=fai),若 x 在割中与 i 在同一集合,将
f
a
x
fa_x
fax 改为 i ,否则不变。这样一来,
- 对于白点,完成了 递归下去时把 R R R 分为两个集合 的操作;对于黑点,这个修改使合并的连边始终合法。
- 对于 f a i fa_i fai 与其父亲 Fa 的连边也需修改,当 Fa 在割中与 i 在同一集合,则把 f a f a i fa_{fa_i} fafai 改为 i,边权为当前割,并把 f a i fa_i fai 改为 Fa,边权为之前 f a i fa_i fai 与 f a f a i fa_{fa_i} fafai 的权。
- i 只需从 2 到 n 枚举 即可。
- C o m p l e t e d Completed Completed
性质
由引理
树上两点的最小割=两点路径上所有边中的最小割