最大流-最小割定理:最大流的值为最小割的容量!
s-t割定义为对V的一个二划分,其中s和t属于不同的两个集合S和T。割集就是{ (u,v)| u属于S, v属于T }。显然,如果割集中的所有边被移除,那么|f| = 0。
割的容量定义为c(S, T) = sum{ c(u,v), 其中u属于S,v属于T }。
给定一个流网络G和一个流,流的残留网Gf拥有与原网相同的顶点。原流网络中每条边将对应残留网中一条或者两条边,对于原流网络中的任意边(u, v),流量为f(u, v),容量为c(u, v):
l 如果f(u, v) > 0,则在残留网中包含一条容量为f(u, v)的边(v, u);
l 如果f(u, v) < c(u, v),则在残留网中包含一条容量为c(u, v) - f(u, v)的边(u, v)。
增广路径可以看作是残留网中源点s到汇点t的一条路径,并且沿着这条路径可以增加更多的流。
Ford-Fulkerson方法
本节开始讨论解决最大流问题的Ford-Fulkerson方法,该方法也称作“扩充路径方法”,该方法是大量算法的基础,有多种实现方法。在以后章节中我们将介绍并分析一种特定的算法。
Ford-Fulkerson算法是一种迭代算法,首先对图中所有顶点对的流大小清零,此时的网络流大小也为0。在每次迭代中,通过寻找一条“增广路径”(augument path)来增加流的值。增广路径可以看作是源点s到汇点t的一条路径,并且沿着这条路径可以增加更多的流。迭代直至无法再找到增广路径位置,此时必然从源点到汇点的所有路径中都至少有一条边的满边(即边的流的大小等于边的容量大小)。