网络流学习笔记

最大流

Dinic 和 Hlpp,这两个比较常用的,我一般选择后者,不过要输出方案的话最好是用 Dinic。

放一个封装好的 HLPP,这个版本是不遵守流量守恒的,大概率会有流量没有退回源点。

Oiwiki

最大流最小割定理

对于 的定义以及一些结论与证明,可以参考 Oiwiki

我理解的证明分两部分,一部分证明 “最小割 \(\ge\) 最大流”,另外一部分就是构造出一种情况使得 “最小割等于最大流”。

前者的理解,可以偏抽象,将割边视作断掉的边,使得源到汇无流量,那么这个 \(\ge\) 成立。

后者的话,只要将汇单独划入另一个集合,就是一个 \(=\) 号成立的方案。

只要定义理清证明就不难。

最大流最小割定理的运用

根据定理,我们可以随时将最大流问题和最小割问题相互转化,以下就是一道很不错的例题:

CF1383F

对于每条特殊边,我们考虑是否将其划入割边的集合,能够得到一个当前的最小割。将最大流问题转化为最小割之后,就可以将所有 \(2^k\) 种情况中 其它边 组成的最小割(最大流)先跑出来,然后将这些边的贡献加入,就可以求出每次的最小割。至于这个预处理部分,是可以在其它情况的残量网络的基础上跑若干次増广路得到。


最小费用最大流

和最大流的区别在于:每次寻找边权的最短路进行增广。

那么由于边权的存在,跑分层图用 SPFA 就会【】。但是负边权的存在又会导致 Dji 无法正常工作。

给边加权非常难受,还要记录经过的边数,具体实现……也非常不尽人意。

考虑给点加权以后,终点为当前点的一条路径的权值会加上当前点的新增点权。

具体的内容可以参考 this

Code

posted @ 2021-02-24 18:12  zjjws  阅读(78)  评论(1编辑  收藏  举报