网络流算法(Ford-fulkerson方法)

一. 预备知识

1. 流网络:

有向图G=(V,E)满足(1)存在无入边的源结点s(2)存在无出边的目标点t(3)每条边e都有一个非负容量ci

2. 流

流网络中从s-t的流是一个实值函数 f ,满足

3. 余图(残存网络)

对于流网络G,边容量为c,流为f,则定义残存容量cf 为

 即,对每一条边,正向记为:c - f,逆向记为:f

图(a)为一个流网络,图(b)展示了它的余图 

4. 增广路径

在余图中找到一条s~>t最大流量的路径,该路径为增广路径

上图(b)中s-v2-v3-t,容量为4的路径即为增广路径

5. 流网络的切割

流网络G中的一个切割(S,T)将结点集合V划分为S和T=V-S两个集合,满足s€S,t€T。

  • 切割的净流量:

                    

  • 切割的容量:

                    

推论:流和割弱对偶关系

给定流网络 G=(V,E),s是源,t是汇.  设f是G上的 一个流,S,T是G的任意一个切割,则f(S,T)=| f |.

给定流网络 G=(V,E). 设f是G上的一个流,S,T 是G的任意一个割,则| f | <= c(S,T)

二.最大流算法(基本的Ford-fulkerson方法)

1. 思路:

(1)初始化:对所有的e,f( e ) = 0

(2)while迭代:

                        只要G的余图中存在增广路径P,沿着P更新 流 和 余图

        直到不存在P

(3) 得到最大流

2. 定理

3. 算法正确性证明

(1)可终止性:不妨将容量放缩,乘一个系数使之成为整数,则每次流至少增加整数1,则可终止

(2)时间复杂度:O(mC),m:边的数量,C:最大流 | f |。

(3)正确性:

设FF算法在流 f 上停止

则,不存在s - t 的路径P,即s 与 t不连通

设:与s连通的点集为S,

则(S,V-S)是G的一个切割

对任意的u€S,v€V-S,f(u,v) = c(u,v)

则| f | = c(S,T)

而| f | <= c(S,T)

则f是最大流。

4. 算法改进:

--算法优劣主要取决于寻找增广路径的时间复杂度

 

猜你喜欢

转载自www.cnblogs.com/duanshuai/p/13177183.html