网络流,顾名思义,是求网络中的流量。
这里的教程比较容易理解
主要性质:
- 容量限制 任何边的流量不能超过其流量。
- 斜对称 显然,若一条边的流量为w,即从u->v流量为w,可以看作是从v->u流量为-w。
- 流量守恒 网络中除原点,汇点以外,任何节点不储存流。这个也比较容易说明,因为如果某一时刻某个中间节点储存了流,则下一时刻它会储存更多。最后储存满了,这些满的流量不能流向汇点,就浪费了。
(lyd:网络流模型可以形象的描述为:在不超过流量限制的前提下,“流”从原点不断产生,流经整个网络,最终全部归于汇点。)
Edmonds-Karp算法
增广路:如果一条从起点到终点的路径上剩余流量都大于零,则最大流可以加上这条边流量的瓶颈,即这条路径上的最小剩余流量。EK的思想就是不断寻找增广路,直到找不到增广路为止。
具体实现:每次用BFS寻找增广路,若找到了,则将这条路径上的所有边减少增加的流量,还要把其反向边的流量增加相同的数值,重复上述过程,直到找不到增广路。
为什么要增加反向边的流量?因为算法不能保证每次找到的都是最优解。而构建反向边,则给了程序一个“反悔”的机会。在构建反向边后,如果另一条增广路需要经过已经寻找到增广路上的边,而这条边已经没有剩余流量了,就可以让原来的那条增广路走另一条路,这样又可以拓展出一条增广路。
如图,若是一条增广路,当寻找从点的增广路时可以把点的部分流量导到B点,即A的流量就变成了和两条。再拓展这条路,就使得答案增加了。这一操作其实就等价于反向边上增加流量,因为反向边上增加多少,正向边就减少多少。