图论-最小割树 Gomory−HuTree
作用:可以快速求出网络流图中任意两点间的最小割。
学此算法前,你必须对网络流最小割算法的性质很熟练 [学]。
参考文献
https://blog.csdn.net/jyxjyx27/article/details/42750833
Description
给定一个 n n n 个点 m m m 条边的无向连通图, Q Q Q 次询问两点之间的最小割。
数据范围: n ≤ 500 , m ≤ 1500 , Q ≤ 1 0 5 n\le 500,m\le 1500,Q\le 10^5 n≤500,m≤1500,Q≤105。
Introduction
就算是网络最大流最快算法 HLPP \texttt{HLPP} HLPP 时间复杂度 Θ ( V 2 E ) \Theta(V^2\sqrt E) Θ(V2E), 也会在这题轻松 TLE \color{#329}\texttt{TLE} TLE。所以不需要有侥幸心理。
网络流任意两点间的最小割有一个特性:任意两点间的最小割最多出现 n − 1 n-1 n−1 种。所以就有巨佬想到构造一棵树,使得网络流图上任意两点的最小割正好等于树上对应两点的最小割。然后任意两点间的最小割就可以倍增 Θ ( log n ) \Theta(\log n) Θ(logn) 求了。然后这样的一棵树就是这个网络流图的最小割树。
Explanation
下图为网络流图和未生成 Gomory−Hu Tree \texttt{Gomory−Hu~Tree} Gomory−Hu Tree 点集。
Step 1
任选网络流图中两点,跑一次最小割。
选点 1 1 1 和 6 6 6(图中金色节点),最小割为 5 5 5。
割边为 1 ↔ 3 , 2 ↔ 3 , 2 ↔ 5 , 2 ↔ 4 1\leftrightarrow3,2\leftrightarrow3,2\leftrightarrow5,2\leftrightarrow4 1↔3,2↔3,2↔5,2↔4。
点集被分为 ( 1 , 2 ) (1,2) (1,2) 和 ( 3 , 4 , 5 , 6 ) (3,4,5,6) (3,4,5,6)。
Step 2
将原点集分为被最小割割开的两个点集,中间连边最小割。表示两个点集的点之间的最小割最大为选中两点的最小割(因为这么割两边的点必定分开)。
点集被分为 ( 1 , 2 ) (1,2) (1,2) 和 ( 3 , 4 , 5 , 6 ) (3,4,5,6) (3,4,5,6)。
中间连边流量 5 5 5 表示这两个点集的点之间最小割最大为