最大流最小割算法&证明

该文章仅供参考-_-

定义:

假设N=(V,E)是一个有向图,其中结点s和t分别是N的源点和汇点。边(u,v)的容量c(u,v)定义为:能够通过该边的最大流量。
通过每条边的流f(u,v)的需要满足如下约束:
(1)f(u,v) <= c(u,v),即容量约束。
(2)对于任意v不属于{s,t},有sum{ f(u,v) } = sum{ f(v,u) },即流入某个中间结点的流量等于从这个结点流出的流量。

网络流定义f定义为|f| = sum{ f(s,v) },代表从源点流入汇点的流量。
最大流问题,是求得|f|的最大值。
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 }。

最小割问题,是求得这样一个s-t割C(S, T),使得S-T割的容量最小。


最大流最小割定理:一个s-t流的最大值,等于其s-t割的最小容量。

证明(1):

对于某个顶点集合S∈V,从S出发指向S外部的边的集合,记为割(S, V\S)。如果s∈S,t∈(V\S),那么此时的割有成为s-t割。如果将割包含的边都删去,就不再有从s到t的路径了。

最小割问题:对于给定网络,为了保证没有从s到t的路径,需要删去的边的总容量的最小值是多少?
这个问题和最大流问题有很深的联系。对于任意的s-t流f和任意的s-t割(S, V\S)。很容易证明:(f的流量) = (S的出边的总流量-S的入边的总流量) ≤ (S的出边的总流量) = (割的容量)。

用Ford-Fulkerson算法求出了流f,“流完”后的残余网络已经不存在s到t的路径。记从s出发可达的点集合为S,那么S的出边一定已经满流,于是S的入边一定是空的。于是(f的流量) = (S的出边的总流量-S的入边的总流量) = (割的容量)。结合前面的不等式,可知f已经达到最大。


证明(2):
由于具有最大流量的流存在,所以我们可以取一个最大流f.
递归的定义一个顶点集S如下,
首先,source在 S中。
其次,若x在S中,且f(xy) 最后,若x在S中,且f(yx)>0, 则y也在S中。
反复使用上述过程,最后可以得到一个由顶点构成的集合,即S.由于图中只有有限多个顶点,所以上述过程也一定会在有限多个步骤之后终止。还需证明sink不在S中。如下。
假如sink在S中,则有一列顶点,x_1=source, x_2, …, x_n=sink.使得 r_i = \max{c(x_ix_{i+1})-f(x_ix_{i+1}),f(x_{i+1}x_i)}>0
这个式子不大容易看清,我们重新叙述如下,对于该序列中的任意两个相邻顶点x,y,其中x=x_i在y=x_{i+1}前面,都有C(xy)-f(xy)>0 或者 f(yx)>0,取二者当中较大的一个,这个数就是r_i.然后取所有r_i中最小的一个,有限多个正数的最小值还是一个正数(严格大于0)。记这个正数为r.由此对f作一些修改可以构造一个新的流,若边xy在上述序列中,则将流量f(xy)修改为f(xy)+r.否则就不作改变。这样得到的函数确实是一个流,满足容量限制,而且其流量比f的流量要大r>0.这就和f是最大流矛盾。这就证明了S确实为一个割。
下面说明割S的容量 = 流f的流量。首先有等式, f 的流量 = f(S,V-S) – f(V-S,S).
由S的构造,容易看出第一项 f(S,V-S) = C(S,V-S) = 割S的容量。第二项f(V-S,S) = 0.证毕。
记号V-S表示不在S中的顶点全体,亦即表示集合S在V中的余集。

最大流最小割的整性定理:若容量C(xy)都是整数,则最大流f的流量f(xy)也都是整数。

实际上,当每条边的容量都是整数时,max-flow min-cut定理的证明也给出了一个很好的算法。如下,构造流的序列f_0,f_1, f_2, … 使得对每一条边,其流量都是递增的。
流f_0, 对每条边赋予流量f_0(xy)=0. 这是一个平凡的流。对于流f_i, 如max-flowmin-cut定理的证明,构造相应的集合S.则有两种情形。若sink在S中,如此,我们将终止这个构造过程。另一种情形是sink不在S中,这样可找到一条由source到sink的链,亦即一些首尾依次相连的边,这些边连接着source和sink,将这条边的每一个的流量增加1, 这样得到一个新的流f_{i+1}.这个程序将在有限多个步骤之后终止,最后所得即为一个在每条边上的流量都是整数的流。

最大流最小割的对偶定理

前面,我们对于流量进行的限制是要求每一条边的流量有一个上限,即容量C(xy).我们也可以对每一个顶点的容量进行限制,即要求流入每一个顶点的流量有一个上限。注意到对每一个顶点,我们对于流入和流出进行了区分的,在一个不是source或sink的顶点,流入的流量等于流出的流量。因而二者都是有限的。对于这样的图,我们可以类似的定义割、割得容量这两个概念。此时的割称为Vertex-cut, 定义为V-{source,sink}的一个子集S使得,在V-S不可能存在一个具有正流量的流。
通常我们不限制source和sink的流量,或者说,这两个顶点的容量是无穷大。
对顶点限制流量的定向图,可以用一个小的技巧转化为我们已经证明过的对边的容量进行限制的定向图。于是我们有下述的定理。
定理:设定向图(V,E)的顶点有容量限制,但在source和sink处没有容量限制,则关于顶点的最小割的容量 =最大流的流量。
Source 和sink多于1个的情形。
设s_1, s_2, … ,s_n为全部的source, 我们将之转化为只有一个sourece的情形。在原来的定向图中添加一个顶点s,以及定向边ss_i, 在这些边上的容量限制取作无穷大。由此即可转换为只有一个source的情形。
对于sink完全类似的处理即可。
注意到,max-flowmin-cut定理中,如果某些边的容量为无穷大,定理的结论仍然成立,只不过此时的最大流的流量可能是无穷大。证明的方法也没有多大变化,无非就是稍稍改变一下其中的某些叙述。

对应的一道洛谷的裸题https://www.luogu.org/problem/show?pid=1344

题解:http://blog.csdn.net/wzw1376124061/article/details/71269869

你可能感兴趣的:(网络流)