Gomory-Hu Tree 最小割树(详)

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,VW),有
∀ 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,vW,XW,Cut(X,VX)=cut(u,v)

  • 引理:设 f ( S ) = C u t ( S , V − S ) f(S)=Cut(S,V-S) f(S)=Cut(S,VS),则函数满足
    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(AB)+f(AB)f(A)+f(B)f(A\B)+f(B\A)

  • 证明

    不妨设 s , u ∈ X s,u\in X s,uX

    讨论一下,

    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(XW)f(X),f(XW)f(W)f(XW)=f(X),f(XW)=f(W)
    这里 X ∩ W ⊆ W X\cap W \subseteq W XWW 且是满足条件的割。

    t ∈ X \large t\in X tX
    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\XW 且是满足条件的割。

引理

λ ( 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=1n1

做法

​ 随机选两点求最小割,在树上连接两点,把图分为两个点集,递归处理。可以得到一棵树。 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 RV
    • 返回值为"最小割树"(重定义) — 一个二元组 ( 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=(CrrR) 为集合 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,RX两个集合,则 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(rXCr),这与原最小割树定义类似;当 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,u2R ,它们分属割集 W , V − W W,V-W W,VW
    • 递归到 ( 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=RW),(G2=(V2,E2),R2=R(VW)) 可以得到两棵树 ( 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=VX+v2,其中 V − X → v 1 , X → v 2 V-X \rightarrow v_1,X \rightarrow v_2 VXv1,Xv2
    • 再考虑合并
    • 有一种比较自然的想法 — 将 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 x1W),故 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} v1Cx1,所以此方案也代表一种 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

性质

引理

树上两点的最小割=两点路径上所有边中的最小割

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值