网络流学习笔记
最大流
Dinic 和 Hlpp,这两个比较常用的,我一般选择后者,不过要输出方案的话最好是用 Dinic。
放一个封装好的 HLPP,这个版本是不遵守流量守恒的,大概率会有流量没有退回源点。
最大流最小割定理
对于 割 的定义以及一些结论与证明,可以参考 Oiwiki。
我理解的证明分两部分,一部分证明 “最小割 \(\ge\) 最大流”,另外一部分就是构造出一种情况使得 “最小割等于最大流”。
前者的理解,可以偏抽象,将割边视作断掉的边,使得源到汇无流量,那么这个 \(\ge\) 成立。
后者的话,只要将汇单独划入另一个集合,就是一个 \(=\) 号成立的方案。
只要定义理清证明就不难。
最大流最小割定理的运用
根据定理,我们可以随时将最大流问题和最小割问题相互转化,以下就是一道很不错的例题:
对于每条特殊边,我们考虑是否将其划入割边的集合,能够得到一个当前的最小割。将最大流问题转化为最小割之后,就可以将所有 \(2^k\) 种情况中 其它边 组成的最小割(最大流)先跑出来,然后将这些边的贡献加入,就可以求出每次的最小割。至于这个预处理部分,是可以在其它情况的残量网络的基础上跑若干次増广路得到。
最小费用最大流
和最大流的区别在于:每次寻找边权的最短路进行增广。
那么由于边权的存在,跑分层图用 SPFA 就会【】。但是负边权的存在又会导致 Dji 无法正常工作。
给边加权非常难受,还要记录经过的边数,具体实现……也非常不尽人意。
考虑给点加权以后,终点为当前点的一条路径的权值会加上当前点的新增点权。
具体的内容可以参考 this。
$$\texttt{Dirty Deeds Done Dirt Cheap}$$