网络流之最大流算法(EdmondsKarp)

标签: 网络流算法EdmondsKarp流量最大流
2014-03-11 18:05 34795人阅读 评论(12) 收藏 举报
 分类:
图论~~网络流(26) 

版权声明:本文为博主原创文章,未经博主允许不得转载。

求网络流有很多算法,这几天学习了两种,记录一下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是一道可以作为模板题目练手。

模板代码:

[cpp] view plaincopy print?
  1. #include <cstdio>
  2. #include <cstring>
  3. #include <iostream>
  4. #include <string>
  5. #include <algorithm>
  6. #include <map>
  7. #include <vector>
  8. using namespace std;
  9. const int N = 1100;
  10. const int INF = 0x3f3f3f3f;
  11. struct Node
  12. {
  13. int to;//终点
  14. int cap; //容量
  15. int rev;  //反向边
  16. };
  17. vector<Node> v[N];
  18. bool used[N];
  19. void add_Node(int from,int to,int cap)  //重边情况不影响
  20. {
  21. v[from].push_back((Node){to,cap,v[to].size()});
  22. v[to].push_back((Node){from,0,v[from].size()-1});
  23. }
  24. int dfs(int s,int t,int f)
  25. {
  26. if(s==t)
  27. return f;
  28. used[s]=true;
  29. for(int i=0;i<v[s].size();i++)
  30. {
  31. Node &tmp = v[s][i];  //注意
  32. if(used[tmp.to]==false && tmp.cap>0)
  33. {
  34. int d=dfs(tmp.to,t,min(f,tmp.cap));
  35. if(d>0)
  36. {
  37. tmp.cap-=d;
  38. v[tmp.to][tmp.rev].cap+=d;
  39. return d;
  40. }
  41. }
  42. }
  43. return 0;
  44. }
  45. int max_flow(int s,int t)
  46. {
  47. int flow=0;
  48. for(;;){
  49. memset(used,false,sizeof(used));
  50. int f=dfs(s,t,INF);
  51. if(f==0)
  52. return flow;
  53. flow+=f;
  54. }
  55. }
  56. int main()
  57. {
  58. int n,m;
  59. while(~scanf("%d%d",&n,&m))
  60. {
  61. memset(v,0,sizeof(v));
  62. for(int i=0;i<n;i++)
  63. {
  64. int x,y,z;
  65. scanf("%d%d%d",&x,&y,&z);
  66. add_Node(x,y,z);
  67. }
  68. printf("%d\n",max_flow(1,m));
  69. }
  70. }

网络流之最大流算法(EdmondsKarp)相关推荐

  1. 算法学习笔记 网络流之最大流算法

    文章目录 26.1 流网络 1. 流网络和流 2. 流的一个例子 3. 使用反平行边来建模问题 4. 具有多个源点和多个汇点的网络 26.2 *Ford-Fulkerson* 方法 1. 残存网络 2 ...

  2. 网络流之最大流算法——EK算法(通俗讲解)

    先放道模板题来说明网络流: Power Network A power network consists of nodes (power stations, consumers and dispatc ...

  3. 最大流的算法——Edmonds-Karp算法(最短路径增广算法)

    最大流的算法--Edmonds-Karp算法(最短路径增广算法) 这里介绍一个最简单的算法:Edmonds-Karp算法 即最短路径增广算法 简称EK算法 EK算法基于一个基本的方法:Ford-Ful ...

  4. 网络流初步:最大流(Dinic算法)

    网络流初步:最大流 标签: 网络流 最大流 Dinic 最大流 例题 POJ****(USACO4.2.1) 在农夫约翰的农场上,每逢下雨,Bessie最喜欢的三叶草地就积聚了一潭水.这意味着草地被水 ...

  5. 网络流:最大流,最小割 基本概念及算法

    原文:http://www.cnblogs.com/Booble/archive/2011/03/04/1970453.html 参考:http://community.topcoder.com/tc ...

  6. 网络流初步最大流(EK算法和Dinic算法进阶)

    网络流最大流(network_flows) 网络流是一种类比水流的解决问题的方法,首先我们要明白它解决的是什么样的问题. 比如说最基本的,从水厂通过各种水管到达你家的能有多少水量,每个水管有自己的流量 ...

  7. 最小费用最大流算法 网络流

    最小费用最大流算法 图片来源 <趣学算法> 人民邮电出版社 陈小玉 代码实现 /* 参考:<趣学算法>陈小玉 人民邮电出版社 最小费用最大流---最小费用路算法 问题分析:在实 ...

  8. 网络流中最大流和最小割算法

    学习顺序按照下图的改进历程 问题转化:寻找初始解,提升,达到条件停止 求解优化,加回溯边,画残差图,在残差图中寻找一条s可到t的路径 看最大流最小割问题,证明 除 ST外每个点的出度和入度相等,S和T ...

  9. 网络流(2)——用Ford-Fullkerson算法寻找最大流

    寻找最大流 在大规模战争中,后勤补给是重中之重,为了尽最大可能满足前线的物资消耗,后勤部队必然要充分利用每条运输网,这正好可以用最大流模型解决.如何寻找一个复杂网络上的最大流呢? 直觉上的方案 一种直 ...

最新文章

  1. 中国法院裁定:禁售部分型号苹果手机
  2. MAVEN [ERROR] 不再支持源选项 5。请使用 7 或更高版本。
  3. vue中 mock使用教程
  4. macpro连接不到索尼耳机WH-1000XM3搜索不到索尼连接
  5. leetcode243. 最短单词距离(vip题)好像挺简单?
  6. 请概述可视化卷积神经网络的中间输出的基本思想。_最详细的卷积神经网络入门指南!...
  7. SEO关键字优化策略-Google Analytics提高关键字转化的的6步骤
  8. selenium模拟登录豆瓣和qq空间
  9. photoshop cs3 字体 即时预览
  10. python 标准库 excel_Python 操作 Excel 的函数库
  11. 查看linux文件的日期格式,5个在Linux中管理文件类型和系统时间的有用命令
  12. Jsp论坛系统(BBS)源码
  13. Granger格兰杰因果关系的设计、基本假设和额外要求
  14. NIUSHOP wap端底部导航设置
  15. 概率论-分布函数(高斯分布、复高斯分布、瑞丽分布、Nakagami-m分布、均匀分布、卡方分布)
  16. 医生,我的眼球掉出来了,快帮我种回去!
  17. 寻找市场中的Alpha—WorldQuant的阿尔法设计理念(上)
  18. 3年Python编程自学经历,分享一些心得经验
  19. w3c易语言教程,EPL易语言编程下载
  20. IT服务模式变迁影射新旧商业时代交替

热门文章

  1. scrumndash;yesterday once more
  2. checksum命令 linux_linux命令详解:md5sum命令
  3. nginx 一个请求发给多台机器_配置Nginx实现负载均衡
  4. fetch 不是xhr_春招|前端2019应届春招:不是被大厂选,而是选大厂(字节跳动,美团,网易)...
  5. jsp项目开发案例_Laravel中使用swoole项目实战开发案例一 (建立swoole和前端通信)
  6. Java高级架构师需要掌握什么?
  7. java密码框提示_[Java教程]如何实现在密码框如出现提示语
  8. class会不会回收?用不到的class怎么回收_牛X的java程序员必备的GC基础知识, 面试肯定用的到...
  9. mybatis传递多个参数_MyBatis 映射器
  10. adb android源码分析,Android Adb 源码解析(base on Android 9.0)