网络流之最大流算法(EdmondsKarp)
来源:互联网 发布:c语言联合体int的大小 编辑:程序博客网 时间:2024/05/21 21:02
网络流之最大流算法(EdmondsKarp)
版权声明:本文为博主原创文章,未经博主允许不得转载。
求网络流有很多算法,这几天学习了两种,记录一下EK算法。
首先是网络流中的一些定义:
V表示整个图中的所有结点的集合.
E表示整个图中所有边的集合.
G = (V,E) ,表示整个图.
s表示网络的源点,t表示网络的汇点.
对于每条边(u,v),有一个容量c(u,v) (c(u,v)>=0),如果c(u,v)=0,则表示(u,v)不存在在网络中。相反,如果原网络中不存在边(u,v),则令c(u,v)=0.
对于每条边(u,v),有一个流量f(u,v).
一个简单的例子.网络可以被想象成一些输水的管道.括号内右边的数字表示管道的容量c,左边的数字表示这条管道的当前流量f.
网络流的三个性质:
1、容量限制: f[u,v]<=c[u,v]
2、反对称性:f[u,v] = - f[v,u]
3、流量平衡: 对于不是源点也不是汇点的任意结点,流入该结点的流量和等于流出该结点的流量和。
只要满足这三个性质,就是一个合法的网络流.
最大流问题,就是求在满足网络流性质的情况下,源点 s 到汇点 t 的最大流量。
求一个网络流的最大流有很多算法 这里首先介绍 增广路算法(EK)
学习算法之前首先看了解这个算法中涉及到的几个图中的定义:
**残量网络
为了更方便算法的实现,一般根据原网络定义一个残量网络。其中r(u,v)为残量网络的容量。
r(u,v) = c(u,v) – f(u,v)
通俗地讲:就是对于某一条边(也称弧),还能再有多少流量经过。
Gf 残量网络,Ef 表示残量网络的边集.
这是上面图的一个残量网络。残量网络(如果网络中一条边的容量为0,则认为这条边不在残量网络中。
r(s,v1)=0,所以就不画出来了。另外举个例子:r(v1,s) = c(v1,s) – f(v1,s) = 0 – (-f(s,v1)) = f(s,v1) = 4.
其中像(v1,s)这样的边称为后向弧,它表示从v1到s还可以增加4单位的流量。
但是从v1到s不是和原网络中的弧的方向相反吗?显然“从v1到s还可以增加4单位流量”这条信息毫无意义。那么,有必要建立这些后向弧吗?
显然,第1个图中的画出来的不是一个最大流。
但是,如果我们把s -> v2 -> v1 -> t这条路径经过的弧的流量都增加2,就得到了该网络的最大流。
注意到这条路径经过了一条后向弧:(v2,v1)。
如果不设立后向弧,算法就不能发现这条路径。
**从本质上说,后向弧为算法纠正自己所犯的错误提供了可能性,它允许算法取消先前的错误的行为(让2单位的流从v1流到v2)
注意,后向弧只是概念上的,在程序中后向弧与前向弧并无区别.
**增广路
增广路定义:在残量网络中的一条从s通往t的路径,其中任意一条弧(u,v),都有r[u,v]>0。
如图绿色的即为一条增广路。
看了这么多概念相信大家对增广路算法已经有大概的思路了吧。
**增广路算法
增广路算法:每次用BFS找一条最短的增广路径,然后沿着这条路径修改流量值(实际修改的是残量网络的边权)。当没有增广路时,算法停止,此时的流就是最大流。
**增广路算法的效率
设n = |V|, m = |E|
每次增广都是一次BFS,效率为O(m),而在最坏的情况下需要(n-2增广。(即除源点和汇点外其他点都没有连通,所有点都只和s与t连通)
所以,总共的时间复杂度为O(m*n),所以在稀疏图中效率还是比较高的。
hdoj 1532是一道可以作为模板题目练手。
模板代码:
- 网络流之最大流算法(EdmondsKarp)
- 网络流之最大流算法(EdmondsKarp)
- 网络流之最大流算法(EdmondsKarp)
- 网络最大流-EdmondsKarp
- 最大流EdmondsKarp算法
- 网络流解析——最大流EdmondsKarp算法
- 【最大流之EdmondsKarp算法】【HDU1532】模板题
- hdu 1532 Drainage Ditches(网络流之最大流EdmondsKarp)
- poj-1459-最大流-edmondskarp算法
- 刘汝佳紫书-EdmondsKarp算法解决最大流问题
- hdoj-1532-edmondsKarp最大流算法模板
- POJ 1459 Power Network (最大流, 网络流, EdmondsKarp算法求解最大流)
- 网络流 EdmondsKarp和 Dinic算法
- 网络流模板--edmondsKarp
- 求图的最大流-EdmondsKarp方法
- 【最大流 模板题 EdmondsKarp】HDU
- 网络流模板-(EdmondsKarp)-HDU-1532-Drainage Ditches
- 最大流模板【EdmondsKarp算法,简称EK算法,O(m^2n)】
- 字符串对比 (STl强制转换字符串)
- 服务器端编程心得(三)—— 一个服务器程序的架构介绍
- 自己对sg函数的小理解
- 移除wordpress前端自带的js和css
- C++流程控制语句
- 网络流之最大流算法(EdmondsKarp)
- sql学习(2)
- 2016/11/20 第一次佛山实习总结
- 「学点工具」系列之Fiddler
- POJ 2750 Potted Flower (线段树+动归)
- 轮回
- django学习笔记---第六章:Admin
- MySQL函数
- 数学在机器学习中的作用给的评述