网络流模板

网络流,顾名思义,是求网络中的流量。
这里的教程比较容易理解

主要性质:

  • 容量限制 任何边的流量不能超过其流量。
  • 斜对称 显然,若一条边的流量为w,即从u->v流量为w,可以看作是从v->u流量为-w。
  • 流量守恒 网络中除原点,汇点以外,任何节点不储存流。这个也比较容易说明,因为如果某一时刻某个中间节点储存了流,则下一时刻它会储存更多。最后储存满了,这些满的流量不能流向汇点,就浪费了。

(lyd:网络流模型可以形象的描述为:在不超过流量限制的前提下,“流”从原点不断产生,流经整个网络,最终全部归于汇点。)

Edmonds-Karp算法

增广路:如果一条从起点到终点的路径上剩余流量都大于零,则最大流可以加上这条边流量的瓶颈,即这条路径上的最小剩余流量。EK的思想就是不断寻找增广路,直到找不到增广路为止。

具体实现:每次用BFS寻找增广路,若找到了,则将这条路径上的所有边减少增加的流量,还要把其反向边的流量增加相同的数值,重复上述过程,直到找不到增广路。

为什么要增加反向边的流量?因为算法不能保证每次找到的都是最优解。而构建反向边,则给了程序一个“反悔”的机会。在构建反向边后,如果另一条增广路需要经过已经寻找到增广路上的边,而这条边已经没有剩余流量了,就可以让原来的那条增广路走另一条路,这样又可以拓展出一条增广路。
在这里插入图片描述

如图,若 A > E > F > D A->E->F->D 是一条增广路,当寻找从 C C 点的增广路时可以把 A A 点的部分流量导到B点,即A的流量就变成了 A > E > F > D A->E->F->D A > E > B A->E->B 两条。再拓展 C > F > D C->F->D 这条路,就使得答案增加了。这一操作其实就等价于反向边上增加流量,因为反向边上增加多少,正向边就减少多少。