在一个流网络中,如果给定了所有边的容量,那么我们可以计算出这个流网络的最大流。也就是说,在每条边都有其容量限制的情况下,从源点s输出,通过这个网络达到汇点的最大流量是可以计算出来的。从一个可行的流(例如每条边的流量为0的流)开始,Ford-Fulkerson(图8-3)持续寻找到一条增广路,这条增广路通过一个s到t的网络,并且这条增广路上可以增加更多的流。如果不能再找到一条增广路,那么算法终止。最大流最小割理论(Ford-Fulkerson,1962)保证没有负流和负容量限制,Ford-Fulkerson肯定能够终止并且能够找出网络中的最大流。
图 8-3 Ford-Fulkerson详解输入/输出
我们使用链表来存储边,每个顶点u维护着两个不同的列表:从u发出的前向边和指向u的后向边,因此每条边都会在这两个列表中出现,需要多一倍的存储空间。本书的代码库中的算法实现使用的是一个二维的矩阵来存储边,这个数据结构更适用于稠密的流网络图。
输入
流网络G=(V,E)有一个源点s和一个汇点t。每条有向边e=(u,v)都有一个整数容量c(u,v)以及一个实际的流f(u,v)。
输出
Ford-Fulkerson会处理每条边(u,v)。计算出给定的容量限制下,从s到t的最大流。这个时候,Ford-Fulkerson也计算出来了这个网络的最小割,也就是说形成瓶颈的边集。