最大流问题及Ford-Fulkerson方法
2016-03-18 22:55
351 查看
流网络
流网络是一个有向图,G=(V,E),图中的每条边有一个非负的容量值c(u,v)≥0.如果(u,v)∉E,则定义c(u,v)=0。且在流网络中含有两个特殊的点:源节点 s和汇结点 t。流网络的形式化定义如下:
设G=(V,E)为一个流网络,其容量函数为 c。G中的流是一个实值函数f:V×V→R,满足如下性质:
容量限制:对于所有结点u,v∈V,其中0≤f(u,v)≥c(u,v) .
对于所有结点u∈V−s,t,其中∑v∈Vf(v,u)=∑v∈Vf(u,v)
f(u,v)为从结点u到结点 v的流。
流
一个流的值 |f|定义为:|f|=∑v∈Vf(s,v)−∑v∈Vf(v,s)即,流f的值为从源结点流出的总流量减去流入源结点的总流量。
最大流问题就是在给定的流网络中找到最大的流。
Ford-Fulkerson
之所以称它为方法,是因为它本身包含了几种运行时间各不相同的具体实现。在了解Ford-Fulkerson方法之前,我们先来看以下几个概念。
残存网络
在给定的流网络G和流f,* 残存网络 Gf *由那些仍有空间对流量进行调整的边构成。其残存流量定义为cf(u,v)=c(u,v)−f(u,v)
只有当cf(u,v)>0,才将边<u,v>加入到残次网络中。
更一般的,残存容量可以定义为:
假定有一个流网络G=(V,E),其源结点为s,汇结点为t。设f为图G中的一个流,考虑结点对u,v∈V的残存容量cf(u,v):
cf(u,v)=⎧⎩⎨c(u,v)−f(u,v),f(u,v)0若(u,v)∈E若(u,v)∈E其他
而残存网络的每条边,即残存边必须允许大于0的流量通过。
相关文章推荐
- 书评:《算法之美( Algorithms to Live By )》
- 动易2006序列号破解算法公布
- Ruby实现的矩阵连乘算法
- C#插入法排序算法实例分析
- 超大数据量存储常用数据库分表分库算法总结
- C#数据结构与算法揭秘二
- C#冒泡法排序算法实例分析
- 算法练习之从String.indexOf的模拟实现开始
- C#算法之关于大牛生小牛的问题
- C#实现的算24点游戏算法实例分析
- c语言实现的带通配符匹配算法
- 浅析STL中的常用算法
- 算法之排列算法与组合算法详解
- C++实现一维向量旋转算法
- Ruby实现的合并排序算法
- C#折半插入排序算法实现方法
- 基于C++实现的各种内部排序算法汇总
- C++线性时间的排序算法分析
- C++实现汉诺塔算法经典实例
- PHP实现克鲁斯卡尔算法实例解析