网络流 及其变种
注:记号约定如下。
在一般网络流中,边 (u,v,w) 被表示为 u\overset{w}{\to} v。
在上下界网络流中,令边 u\ \dfrac{\scriptsize c(u,v)}{\scriptsize b(u,v)}\kern{-1.8em}\kern{-.5em}-\kern{-.5em}\longrightarrow v 的流量上界为 c(u,v),流量下界为 b(u,v)。
在上下界费用流中,边 (u,v,\dfrac{w1}{w2},c) 表示从 u 到 v、流量上界为 w1、流量下界为 w2、费用为 c 的边。
- 普通网络流 \Rightarrow Dinic, ISAP, etc。
- 普通费用流 \Rightarrow 残量网络分层算法由 BFS 改为 SPFA,且要保证 DFS 搜出的增广路径不为环。
- 有负环的费用流 \Rightarrow 对于所有边 (u,v,\dfrac{w}{0},c),若 c<0,则将该边替换为 边 (u,v,\dfrac{w}{w},c) 和 边 (v,u,\dfrac{w}{0},-c),转化为上下界费用流问题。
- 上下界网络流
- 无源汇上下界可行流
- 令每条边都已经流了 b(u,v) 的流量,设其为初始流。对于原图所有边 u\to v,在新图中加入对应边 u\ \overset{\underrightarrow{\scriptsize{c(u,v)-b(u,v)}}}{ }\ v。
- 调整新图。先在新图中加入两个附加点 S',T'。设初始流中,点 u 的 初始流入流量 - 初始流出流量 =M。
若 M=0,无需附加边。
若 M>0,即初始入流量过大,在新图中加入附加边 S'\overset{M}{\to} u。
若 M<0,即初始出流量过大,在新图中加入附加边 u\overset{-M}{\to} T'。
- 新图建完后,跑 S' 到 T' 的最大流,要求附加边全部满流。因为只有在这种前提下,新图流量平衡 才能推得 原图流量平衡。若不能保证 S' 连出去的边全部满流,则可行流不存在。
- 有源汇上下界可行流 \Rightarrow 新图中加入附加边 T\overset{+\infty}{\longrightarrow} S,转化为无源汇问题。
- 有源汇上下界最大流 \Rightarrow 跑完可行流问题后,删去所有附加边(在实际编写中只需令边 T\to S 及其反边容量为 0),再跑一次从 S 到 T 的最大流。答案为 可行流流量 + 最大流流量。
- 有源汇上下界最小流 \Rightarrow 跑完可行流问题后,删去所有附加边(在实际编写中只需令边 T\to S 及其反边容量为 0),再跑一次从 T 到 S 的最大流。答案为 可行流流量 - 最大流流量。