最大流/最小割树/等价流树 学习笔记
最大流/最小割树/等价流树 学习笔记
最小割树 \(\text{Gomory-Hu Tree}\)
前置
约定无向图点数为 \(n\),边数为 \(m\)。
割:断开一些边,使得 \(s,t\) 两点不连通。
设 \(\lambda(u,v)\) 为 \(u,v\) 的最小割权值。
在非负边权的无向图上使用网络流即可求得两点间的最小割,但是如果涉及查询所有点对的最小割,就需要进行 \(n^2\) 次网络流,复杂度很高。
简介
对于非负边权的无向图,适用于求出多点对之间的最小割/最大流的结构。
1.\(\text{Gomory-Hu Tree}\)的核心性质
构造树,使得树边 \((u,v)\) 满足割掉这条边后,\(u,v\) 的最小割对应将图分为树在两边的这两个集合。
而边 \((u,v)\) 的权值 \(w(u,v)=\lambda(u,v)\)。
2.求解最小割的方法
引理:
\(\lambda(a,b)\ge \min\{\lambda(a,c),\lambda(c,b)\}\)
证明:假设 \(\lambda(a,b) < \min\{\lambda(a,c),\lambda(c,b)\}\)
设 \(a,b\) 最小割的两个集合后两点所属的联通块集合为 \(A,B\),则:
若 \(c\in A\),则 \(a,b\) 最小割也是 \(b,c\) 的割。
若 \(c\in B\),则 \(a,b\) 最小割也是 \(a,c\) 的割。
以上两种情况均与 \(\lambda(a,b) < \min\{\lambda(a,c),\lambda(c,b)\}\) 矛盾。
假设要求 \(u,v\) 两点间的最短路,则答案就是 \(u,v\) 在树上路径的最小边权值,设其为边 \((s,t)\)。
由上面的引理,显然有 \(\lambda(u,v)\ge\lambda(s,t)\)。
而我们由 \(\text{Gomory-Hu Tree}\) 的性质知道,\(s,t\) 的割也是 \(u,v\) 的一个割,即 \(\lambda(u,v)\le \lambda(s,t)\)。
所以答案就是 \(\lambda(s,t)\)。
构建方法
构建 \(\text{Gomory-Hu Tree}\) 最重要的一条引理,可以认为是最小割的"不交叉"性质
对于 \(s,t\) 最小割的一侧,设其点集为 \(W\),则对于任意的 \(u,v\in W\),存在一个 \(s,t\) 最小割 \(X\),满足 \(X\sube W\)。
具体的证明比较复杂,咕,但是这个性质确实非常巧妙。
利用这个性质,可以得到 \(\text{Gomory-Hu Tree}\) 的不严谨的递归构造方法。
对于当前点集 \(S\),若 \(|S|=1\),则结束递归。
从 \(S\) 中选择两个点 \(x,y\) 求出最小割,设在割中 \(x,y\) 所属点集分别为\(X,Y\)。
在 \(\text{Gomory-Hu Tree}\) 上加入边 \((x,y,\lambda(x,y))\),递归解决子问题 \(X\cap S,Y\cap S\)。
实际在递归求解 \(S\) 的问题时,应该将图中其他的点缩点(这是论文里说的,实际没有人这么写)。
是不是不缩点跑出来的树形是错的?
递归求解的次数为 \(O(n)\),只需要求 \(O(n)\) 次网络流即可。
放一下丑陋的板子:
1 |
|
等价流树
等价流树的树形不需要满足 \(\text{Gomory-Hu Tree}\) 的性质,只需要能够查询两点间的答案即可。
在论文中看到的等价流树的非递归构建方法(伪代码)。
\(w_{1,..,n}=0,fa_{1}=1,fa_{2,..,n}=1\)
\(\text{for u = 2 to n do}\) \(v = fa_u\)
求解\(u,v\)最小割
\(w_u=\lambda(u,v)\)
\(\text{for x=u+1 to n do}\)
\(\text{if} fa_x=v \text{ and x在u这一侧 then }fa_x=u\)
\(\text{end for}\)
\(\text{end for}\)
但是这个东西实际也不会跑得比 \(\text{Gomory-Hu Tree}\) 快,了解一下即可。
1 |
|