版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。本文链接:https://blog.csdn.net/weixin_30104533/article/details/80659364

一、流网络

G=(V,E)是一个有向图,其中每条边(u,v)有一个非负的容量值c(u,v),而且如果E中包含一条边(u,v),那么图中就不存在它的反向边。在流网络中有两个特殊的结点,源结点s和汇点t。

流网络的形式化定义

令G=(V,E)为一个流网络,其容量函数为c,设s为网络的源点,t为汇点。G中的流是一个实值函数f,满足以下两条性质:

  1. 容量限制(capacity contraint):对于所有的结点u,v,要求0≤f(u,v)≤c(u,v)0\leq f(u,v)\leq c(u,v)0≤f(u,v)≤c(u,v)

  2. 流量守恒(flow conservation):对于所有的非源点和汇点的结点u,要求∑v∈Vf(v,u)=∑v∈Vf(u,v)\sum_{v\in V}f(v,u)=\sum_{v\in V}f(u,v)∑v∈V​f(v,u)=∑v∈V​f(u,v)

流网络的示例图


其中的“/”只是分隔符而不是运算符,“/”前代表的是流的值,后则是该条边的容量(capacity)

运输问题
(1)需要将货物从s运输到t,途经几个中转站,每次运输到每个中转站的货物的数量是有限制的。在实际应用中我们可能会在某条边上双向运输,这样便违反了我们之前对流网络的定义,但是我们可以将包含反平行边的 图(a) 来改造成 流网络 图(b),具体的方法是引入一个是虚构的中转结点,方法如下图。

(2)考虑另外一种特殊情形,从多个工厂发出货物最终运输到别的多个工厂,这时候我们具有了多个源点和多个汇点,这也很好解决,解决的方法就是人为添加超级源点supersource)和超级汇点supersink),具体方法见下图。

二、Ford-Fulkerson方法

将实际问题转化成流网络后,我们就可以来解决最大流问题了。理解这个方法需要先理解几个关于流网络的基础概念。

1. 残存网络(residual network)

假定有一个流网络G=(V,E),其源点为s,汇点为t,f为G中的一个流。即对点u,v,定义残存容量(residual capacity)cf(u,v)c_f(u,v)cf​(u,v),有:

残存网络可能包含图G中不存在的边,残存网络中的反向边允许算法将已经发送出来的流量发送回去。一个残存网络示例图如下:

图a是一个流网络,b是a对应的残存网络,注意每条边上的值,残存网络中针对每条正向边计算出该条边在存在流的情况下的剩余容量,并画出一条反向边,反向边的容量即是发出流的大小,方便将发出的流运输回发送地,并将权重为0的边省略。

残存网络是如何增大原始流网络中的流的一种指示。如果f是G的一个流,对应的有一个残存网络,残存网络中我们可以定义一个流 f′f^{'}f′。此时我们可以定义一个函数f↑f′f\uparrow f^{'}f↑f′,我们将其称作流f′f^{'}f′对f的增量(augmentation)

2. 增广路径(augmenting paths)

给定流网络G和流f,增广路径p是残存网络中一条从源结点s到汇点t的简单路径。根据残存网络的定义,对于一条增广路径上的边(u,v),我们可以增加其流量的幅度最大为cf(u,v)c_f(u,v)cf​(u,v),即我们之前定义的残存容量(residual capacity)。我们将这里讨论的情形总结成一条引理:

引理 设G为一个流网络,设f为图G中的一个流,设p为残存网络中的一条增广路径。定义一个函数 fpf_pfp​ 如下:

其中fpf_pfp​是残存网络中的一个流,其值∣fp∣=cf(p)>0|f_p|=c_f(p)>0∣fp​∣=cf​(p)>0。

推论 设G为一个流网络,设f为G中的一个流,设p为残存网络中的一条增广路径。设 fpf_pfp​ 如上述引理所定义,假定将f增加fpf_pfp​的量,则函数f↑f′f\uparrow f^{'}f↑f′是图G中的一个流,其值为∣f↑fp∣=∣f∣+∣fp∣>∣f∣|f\uparrow f_p|=|f|+|f_p|>|f|∣f↑fp​∣=∣f∣+∣fp​∣>∣f∣。

3. 流网络的切割(cuts of networks)

流网络G中的一个切割(S,T)(S,T)(S,T)将结点集合V划分为SSS和T=V−ST=V-ST=V−S两个集合,使得s∈S,t∈Ts\in S,t\in Ts∈S,t∈T。若f是一个流,则定义横跨切割(S,T)(S,T)(S,T)的净流量f(S,T)f(S,T)f(S,T)如下:

切割(S,T)的容量是:

一个网络的最小切割是整个网络中容量最小的切割。

举例说明切割的计算方法:

横跨该切割的净流量:

该切割的容量:

引理 设f为流网络G的一个流,该流网络的源结点为s,汇点为t,设(S,T)为流网络G的任意切割,则横跨切割(S,T)的净流量为f(S,T)=∣f∣f(S,T)=|f|f(S,T)=∣f∣。

推论 流网络G中任意流f的值不能超过G的任意切割的容量。

定理(最大流最小切割定理) 设f为流网络G=(V,E)中的一个流,该流网络的源结点为s,汇点为t,则下面的条件是等价的:

1. f是G的一个最大流。

2. 残存网络不包含任何增广路径

3. |f|=c(S,T),其中(S,T)是流网络G的某个切割。

4. 基本的Ford-Fulkerson算法

在Ford-Fulkerrson方法的每次迭代中,寻找某条增广路径ppp,然后使用p来对流f进行修改(增加)。我们不断地在图中寻找增广路径,并依据fpf_pfp​来增大f的值,直到图中不含增广路径。伪代码实现如下:

Ford-Fulkerson算法的运行时间取决与寻找增广路径的方法,这也是Edmonds-Karps算法对基础Ford-Fulkerson算法做改进的理论基础。

我们在残存网络中选择的增广路径是一条从源结点s到汇点t的最短路径,其中每条边的权重为单位距离,我们称如此实现的Ford-Fulkerson算法为Edmonds-Karp算法

第10章 图与网络优化相关推荐

  1. NO.10章 图(遍历、最短路、生成树、拓扑、关键路径)

    1. 定义存储 2. 遍历 1)DFS 2)BFS 3. 最短路径 1)Dijkstra 2)Bellman-Ford 3)SPFA 4)Floyd 4. 最小生成树 1)性质 2)prim 3)kr ...

  2. 数字图像处理:第二章 图象获取、显示、表示与处理

    第二章 图象获取.显示.表示与处理 图象获取是图象的数字化过程,显示则是将数字图象转化为适合人们使用的形式,而处理是通过软件对图象进行变换操作的过程. 目录 图象获取 图象显示 图象表示 图象处理 参 ...

  3. 计算机图形标定学,计算机图形学(璩柏青)第10章空间形体的三维重建与图像处理.ppt...

    计算机图形学(璩柏青)第10章空间形体的三维重建与图像处理 相应可得到各单元方程组集, 即总体方程为 整个SFS问题求解是一个逐次线性化过程,可按如下步骤实现: (1) 先给定一定的初值R(p,q) ...

  4. 《软件项目管理(第二版)》第 10 章——项目收尾 重点部分总结

    文章目录 前言 一.讨论 二.简答题 总结 前言 学习了项目的开发与发布之后,我们就可以单独对一个项目进行开发了,但是在企业中开发中,除了编码之外,还需要项目管理.团队协作开发等,这就是软件项目管理板 ...

  5. 【Java数据结构与算法】第十六章 图

    第十六章 图 文章目录 第十六章 图 一.图 1.介绍 2.基本术语 3.邻接矩阵 4.邻接表和逆邻接表 5.十字链表 二.深度优先遍历 三.广度优先遍历 四.代码实现 一.图 1.介绍 图相较于前面 ...

  6. 《Python游戏趣味编程》 第10章 拼图游戏

    10 拼图游戏 图书简介可以看这里: 童晶:<Python游戏趣味编程>新书上架了 本章我们将编写一个拼图游戏,鼠标先后点击两个小拼图块,交换其坐标,直到全部达到正确位置,效果如图10-1 ...

  7. 第 10 章 桥接模式

    第 10 章 桥接模式 1.手机操作问题 现在对不同手机类型.不同品牌的手机实现操作编程(比如:开机.关机.上网,打电话等) 2.传统方案解决手机问题 类图 传统方案解决手机操作问题分析 扩展性问题( ...

  8. 第 10 章 树结构的基础部分

    第 10 章 树结构的基础部分 1.二叉树 1.1.为什么需要二叉树 1.1.1.数组存储方式的分析 优点: 通过下标方式访问元素, 速度快. 对于有序数组, 还可使用二分查找提高检索速度 缺点: 如 ...

  9. 《学习OpenCV3》第10章 滤波与卷积

    <学习OpenCV3>第10章 滤波与卷积 1. 预备知识 1.1 滤波.核和卷积 1.2 边界外推和边界处理 1.2.1 自定义边框 1.2.2 自定义外推 2. 阈值化操作 2.1 t ...

最新文章

  1. nginx 停止服务方法
  2. Three.js中自定义控制几何体的点和面的属性
  3. ApplicationContextAware接口的拓展和使用
  4. java 文件监听器_java7 文件监听器
  5. ie6 下最佳 PNG透明方案【转】
  6. c++ 高效入门_导学三章_第2章_强哥学Py_Python二级通关与实用入门_17讲
  7. 如何提高服务器响应的数据速度_提升网站服务器的响应速度的方法
  8. 50行python代码自动生成文章_如何通过50行Python代码获取公众号全部文章
  9. Eclipse 快捷键的使用
  10. 对convertView和ViewHolder的理解
  11. Android实现抖音无水印视频
  12. 矩阵按键值在8位数码管流动显示
  13. dnfdpl服务器维护了,魔兽世界TBC:地狱火半岛隐藏的“大恐怖”,魔能机甲成双出没!...
  14. PRBS-存储器测试
  15. WIN10计算机用户怎么改名,win10怎么改名字_win10怎么改用户名字
  16. 发布3天获推荐10w+,视频号内容出现新玩法?
  17. 开尔文夹接线图解_什么是开尔文四线检测|Kelvin Four-terminal sensing|开尔文|Kelvin 4|开尔文四线电阻检测-产品知识-资讯-深圳华壬电子...
  18. php用户登录论坛系统,discuz论坛 用户登录 后台程序代码
  19. camtasia studio2022电脑屏幕录像录屏剪辑
  20. Linux系统编程(二)–信号

热门文章

  1. 11.6 java中jar包使用
  2. 07Oracle Database 数据表
  3. oracle_18c新建用户用normal登陆失败
  4. Cesium Vue开发环境搭建
  5. Memcached内存存储
  6. 网站的容错性设计原则
  7. 机器学习技法-随机森林(Random Forest)
  8. Android学习笔记之使用百度地图实现地图控制
  9. Spark任务调度流程及调度策略分析
  10. char和vchar