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

最大流是要求解流网络图中从源节点到汇点的最大有效值,首先介绍一些基本概念。

流网络

    流网络的概念:是指一个有向图,图中每条边有一个非负的容量值,而且,如果边集合存在边,则图中不存在反向边。在流网络图中存在两个特殊节点:源节点和汇点

流的基本性质:

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

    流量守恒:对于所有节点,要求

Ford-Fulkerson方法

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

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

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

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

残存网络

     给定流网络图和流量,流网络图中的一条边可以允许额外流量等于该边容量减去该边上的流量,若差值为正,则将该边置于残存网络中。残存网络可能包含原流网络图中不存在的边。

,其中

    残存容量的定义:

残存网络结构图示例:

算法——最大流:Ford-Fulkerson方法_第1张图片

    图a左边为原始流网络图,右边为残存网络图,带有箭头的虚线部分表示残存网络的增广路径;

   增广路径

    是指在残存网络图中一条从源节点和汇点之间的简单路径,该简单路径的边属于和不属于交替出现;增广路径的残存容量表示为:

   最大流定理

为流网络中的一个流,该流网络的源节点和汇点,则下面条件等价:

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

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

算法——最大流:Ford-Fulkerson方法_第2张图片

基于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,也就是说我们在残存网络中选择的增广路径是一条从源节点到汇点的最短路径,其中每条边的权重为单位距离。

你可能感兴趣的:(数据结构与算法,数据结构与算法分析)