网络流

对于普通的网络流算法,感觉就是很暴力的寻找增广路,而增广路,就是路径边权最小值最大的一条路径。

网络流的特殊之处,认为就是对反向边的处理,它做了一个负边权的处理,使得有反悔的余地。

这一部分的参考

残量网络:所有剩余容量不为 \(0\) 的边构成的子图叫做原图的残量网络。

最大流:对每条边加入流量,从源点发出的最大流量值。

Edmonds−Karp 增广路算法

增广路:一条从源点到汇点上的所有边剩余容量均不为 \(0\) 的路径。

考虑找增广路的过程,因为最大流可以认为是每条增广路流量的叠加,所以寻找增广路的顺序是不必要的,只要每一次能找到即可。

对于反向边的存储,建议使用链式前向星,因为 vector 写起来好像有点麻烦,从 tot=1 开始存储,对于反向边就是 i^1

因此,我们只需要每一个暴力 \(O(nm)\) 寻找增广路就好了,期望时间复杂度 \(O(nm^2)\)

Submission

Dinic 算法

Dinic 是可以一次找到多条增广路的算法,我们先做一次 bfs 建出分层图,或者称为可能的增广路图,这个分层图显然是个 DAG,我们在这上面跑 dfs,每次动态更新流量,就能做到一次尽可能找到多条增广路了。

Dinic 中用到两个优化,当前弧优化和剪枝,感觉就是名字高大上啊我去,感觉很朴素啊。

  • 当前弧优化,就是对于当前算到这个点的第 \(i\) 条边,显然前面 \(i-1\) 条边的增广路径早就算完了,所以每次从 \(i\) 开始算就好了,注意每一次增广的当前弧是重置的。

  • 剪枝,每次把增广完毕的点删掉就好了。

复杂度 \(O(n^2m)\),比 EK 优得多,实际根本跑不满。

Submission

最大流最小割定理

感性理解,我懒得多写了。

最小割:删除一些权值和最小的边,使得图中不存在合法流。

定理内容就是:对于任意有向图,其最小割等于最大流。

考虑证明,因为 \(最大流 = 最小割\),分别证明 \(最大流 \ge 最小割\)\(最大流 \le 最小割\) 即可。

最大流 \(\le\) 最小割

感性理解为,全图的最大流量为 \(f\),则最小割只要删除最大流所有边,一定会使得原图不存在流,而最小割完全可能删掉更多边,于是有 最大流 \(\le\) 最小割。

最大流 \(\ge\) 最小割

不好感性证明,考虑残量网络,设 \(f'(u,v)\) 为残量网络中边流量,\(c(u,v)\) 为边的容量,\(c(U,V)\) 为两个点集的最小割。

我们将残量网络划分为两个点集 \(U,V\)\(U\)\(s\) 走正权边能走到的点,\(V\) 为其差集,那么显然,跑完最大流之后的 \(U\) 中肯定不包含 \(t\)

对于一条边 \((u,v) \in E\)\(u \in U,v \in V\),则显然在最小割后的网络中 \((u,v)\) 不存在,否则 \(v\) 就能划分到 \(U\) 中。

同理,对于 \((v,u) \in E\)\(u \in V,u \in U\),这条反向边在最小割后的网络中不应存在,否则 \(u\) 就划分到 \(V\) 中。

于是,我们就将所有属于两端点属于不同集合的边删掉,即选择 \(\sum c(u,v)\),而显然最大流可能会选择不满的边,于是有 最大流 \(\ge\) 最小割。

证毕。

P1345

给定一张无向图,求删除点使得原图不连通的最小点数。
\(1 \le n,m \le 600\)

不好直接应用最大流最小割定理,于是考虑经典套路:拆点。

我们将一个点拆成两个,分别管理入边和出边,对于一条边 \((u,v)\),相互之间连 \(inf\) 的边,同一个点连流量为 \(1\) 的边即可,然后就可以应用最大流最小割定理了。

Submission

费用流

先说最小费用最大流,即给每一条边多加了一个边权单位费用,要求在最大流的情况下最小化费用。

posted @ 2025-09-21 16:09  Wei_Han  阅读(34)  评论(0)    收藏  举报