您的位置:首页 > 其它

算法——最大流:Ford-Fulkerson方法

2014-09-07 18:59 585 查看
最大流是要求解流网络图中从源节点到汇点的最大有效值,首先介绍一些基本概念。

流网络

流网络的概念:是指一个有向图

,图中每条边

有一个非负的容量值

,而且,如果边集合

存在边

,则图中不存在反向边

。在流网络图中存在两个特殊节点:源节点

和汇点



流的基本性质:

容量限制:对于所有的节点

,要求



流量守恒:对于所有节点

,要求



Ford-Fulkerson方法

Ford-Fulkerson方法是循环增加流的值,在增加流的值过程中,需要利用残存网络、增广路径和切割。

Ford-Fulkerson方法是一种迭代的计算过程,实现步骤如下:

初始化图中流的值;
在残存网络中找到增广路径;
沿着增广路径增加流的值,直到残存网络不存在增广路径为止;

Ford-Fulkerson(G,s,t)
        initialize flow f to 0
        while there exists an augmenting path  p in the residual network G(f)
                  augment flow f along p
        return f

残存网络

给定流网络图

和流量

,流网络图

中的一条边可以允许额外流量等于该边容量减去该边上的流量,若差值

为正,则将该边置于残存网络

中。残存网络

可能包含原流网络图

中不存在的边。



,其中



残存容量的定义:




残存网络结构图示例:



图a左边为原始流网络图

,右边为残存网络图

,带有箭头的虚线部分表示残存网络的增广路径;

增广路径

是指在残存网络图

中一条从源节点

和汇点

之间的简单路径,该简单路径的边属于

和不属于

交替出现;增广路径的残存容量表示为:


最大流定理



为流网络

中的一个流,该流网络的源节点

和汇点

,则下面条件等价:



为流网络

中的一个最大流;
残存网络不存在增广路径;

例如下图不存在增广路径,则其最大流为





基于Ford-Fulkerson方法的算法

在Ford-Fulkerson方法的每次迭代中,寻找某条增广路径

,然后使用

来对流

进行修改。
Ford-Fulkerson(G,s,t)
	for each edge(u,v) ∈G.E
		(u,v).f = 0
	While there exists a path p from s to t in the residual network Gf	
		cf(p) = min{ cf(u,v):(u,v) is in p}
		for each edge(u,v) in p 
			if (u,v) ∈E
				(u,v).f = (u,v).f+ cf(p)
			else (v,u).f = (v,u).f- cf(p)
算法中很明显,主要是如何寻找增广路径。不同的寻找方法会导致不同的时间复杂度。第2-3行对每条边进行初始化;第4行开始是在while循环里面找到残存网络的增广路径,直到不存在增广路径为止;

Edmonds-Karp算法

在寻找增广路径时,若使用BFS,也就是说我们在残存网络中选择的增广路径是一条从源节点

到汇点

的最短路径,其中每条边的权重为单位距离。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: