推荐blog:
https://www.mina.moe/archives/6256
https://www.cnblogs.com/Eleven-Qian-Shan/p/13274900.html
首先介绍网络流是什么,有什么用处
你可以感性的理解:将网络流看作水流,将自来水公司看作源点,你家看作汇点,从自来水公司到你家有很多管子,每个管子都有所限制的的流量,流过的水的量不能超过管子所能流的最大量,现在问从自来水公司到你家的水流量最大是多少,这就是最大网络流
这个问题如何解决呢,有如下算法
dinic
最坏情况的复杂度为O(n^2*m),所以可以在数据范围不大时放心地使用。
如何操作呢?
例如,这样一张简单图:
如果将1看作源点,5看作汇点,进行dfs,我们得到一个这样的路径,1->2->3->4->5,将遍历过的边减去这条路径所能流的最大流,图就变成这样了:
然而,再进行dfs,我们并不能再搜到一条新的路径,所以最大流是1,然而,这张图的最大流应该为2,这怎么办呢?
我们可以将刚刚dfs的边所用的流量反过来,以便于再次反悔,就像这样
这时再从1号节点dfs可以搜到一条1->3->2->4->5流量为1的路径,再反向,再dfs我们就再也找不到可以从1到5的路了,但是我们可以发现再次反向后的3->2这一条边又变回了原来的老样子,这就是为什么我们要反边
优化:
1、先bfs记录每个点的深度,dfs时只能由深度浅的到深的
2、当前弧优化,即若x点对应的head[x]边,流量已用完,就将head[x]改为链接表指向的下一条边,这样之前那条边就会被跳过
推荐题:luoguP3376
ISAP
见blog:https://www.cnblogs.com/owenyu/p/6852664.html