网络流

推荐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

原文地址:https://www.cnblogs.com/Jessica-Cao/p/13532996.html