网络流
定义
网络
我们称一个带权有向图 \(G=(V,E)\) 为网络,每个网络中还有两个特殊点,源点 \(s\) 和汇点 \(t\)。每条边 \(e\) 的边权为 \(c(e)\),我们称其为容量。
可行流
对于一个网络,定义一个可行流为给每条边的一个流量 \(f(e)\),满足:
- 容量限制:\(\forall e \in E, 0 \leq f(e) \leq c(e)\)。
- 流量守恒:\(\forall u \in V-\{s,t\},\sum \limits_{v} f(u,v) = \sum \limits_{v} f(v,u)\)。即除了源点和汇点之外的每个点,流入量等于流出量(净流量为 \(0\))。
可行流 \(f\) 的流量 \(\left| f \right|\) 定义为源点 \(s\) 的净流出量,即 \(\sum \limits_{v} f(s,v) - \sum \limits_{v} f(v,s)\)。
推论:\(f\) 的流量 \(\left| f \right|\) 也等于 \(t\) 的净流入量,即 \(\sum \limits_{v} f(v,t) - \sum \limits_{v} f(t,v)\)。
割
对于一个网络 \(G=(V,E)\) 和源汇 \(s,t\),定义一个割 \((S,T)\) 为点集 \(V\) 的划分方式 \(V=S \cup T, S \cap T = \varnothing\),其中 \(s \in S, t \in T\)。即把所有点分成两部分,\(s\) 和 \(t\) 分别属于不同部分。
割的容量 \(C(S,T)\) 定义为从 \(S\) 到 \(T\) 的所有边容量和,即 \(\sum \limits_{u \in S, v \in T} c(u,v)\),注意形如从 \(v\) 到 \(u\) 的边不被考虑。
残留网络
对于可行流 \(f\),其残留网络 \(G_f\) 定义如下:
\(G_f\) 的点集仍是原来网络的点集 \(V\)。
对于原网络所有边 \(e(u \rightarrow v)\),若 \(f(e) < c(e)\),\(G_f\) 中有 \(u \rightarrow v\) 的边,容量为 \(c(e)-f(e)\)。
对于原网络所有边 \(e(u \rightarrow v)\),若 \(f(e)>0\),则 \(G_f\) 中有 \(v \rightarrow u\) 的边,容量为 \(f(e)\)。
增广路
对于可行流 \(f\),其增广路定义为 \(G_f\) 中某条从 \(s\) 到 \(t\) 的路径。
网络流相关算法
最大流
对于网络 \(G=(V,E)\) 和源汇 \(s,t\),求流量 \(\left| f \right|\) 最大的可行流 \(f\)。
FF 算法
观察:对于可行流 \(f\),存在流量比 \(\left| f \right|\) 更大的可行流 \(f'\) 等价于 \(f\) 有增广路。
证明:
- 充分。如果 \(f\) 有增广路,令 \(a\) 为其某条增广路上容量最小的边,然后让路径上原本的正向边流量 \(+a\),反向边流量 \(-a\),那么总流量就会加上 \(a\)。又 \(a>0\),于是存在更大的流量。
- 必要。即证如果 \(f\) 不存在增广路,则 \(f\) 是最大流。
引理:对于任意可行流 \(f\) 和割 \((S,T)\),都有 \(\left| f \right| \leq C(S,T)\)。
证明:\(\left| f \right|\) 等于 \(s\) 净流出,也等于 \(S\) 集合净流出(因为除了 \(s\) 其他点净流出为 \(0\)),进一步等于 \(S \rightarrow T\) 流量减去 \(T \rightarrow S\) 流量,小于等于 \(C(S,T)\)。
引理证毕。
推论:如果存在 \(\left|f\right|=C(S,T)\),则 \(f\) 是最大流,\(S,T\) 是最小割。
考虑一个可行流 \(f\) 和其残留网络 \(G_f\),令 \(S\) 为 \(G_f\) 中从 \(s\) 出发能到的点,\(T=V-S\),可以证明此时 \(\left| f \right| =C(S,T)\)。
考虑 \(S \rightarrow T\) 的边在 \(f\) 中必然满流,同时 \(T \rightarrow S\) 的边在 \(f\) 中流量必然全都是 \(0\)。那么 \(\left|f \right|\) 就等于 \(S \rightarrow T\) 流出量等于 \(S \rightarrow T\) 容量,等于 \(C(S,T)\)。
基于上述证明,我们也直接得到了最大流最小割定理,即最大流等于最小割。并且我们得到了一个最大流算法:不断找增广路直到不存在增广路。直接的实现复杂度为 \(O(\left|E\right|\left|f\right|)\),其实是非多项式复杂度的。
EK 算法
FF 算法的改版,基于 BFS 每次寻找最短的增广路,可以证明复杂度为 \(O(\left|V\right|\left|E\right|^2)\)。
例题
Problem A. CF628F Bear and Fair Set
题意:有一个 \(n\) 个数的整数集合,保证 \(5\mid n\),每个数都在区间 \([1,b]\) 区间中,且 \(n\) 个数中模 \(5\) 余 \(0,1,2,3,4\) 的数的个数都相同。现在有 \(q\) 个限制,每个形如 \([1,u_i]\) 中在集合内的数的个数为 \(t_i\),判断是否存在合法的一个集合。
解法:
考虑把所有限制离线排序,然后转化成前缀和差,就变成了若干个互不相交的区间,每个区间的和是某个数。注意这里需要添加一个 \([1,b]\) 有 \(n\) 个数。
建立网络,建 \(5\) 个虚点,从源点连向他们,每条边容量都是 \(\dfrac{n}{5}\),然后每个虚点向相对应的余数为 \(0,1,2,3,4\) 连边,容量为 \(1\)。限制变成新建一个虚点,将 \([l,r]\) 中每个点向这个虚点连边,容量为 \(1\)。虚点向汇点连边,容量为 \(c\),\(c\) 为这个区间中的数的个数。显然问题等价于最大流是否为 \(n\)。使用 Dinic 即可通过。

浙公网安备 33010602011771号