《算法问题实战策略》-chaper32-网络流
基本的网络流模型:
在图论这一块初步的应用领域中,两个最常见的关注点,其一时图中的路径长度,也就是我们常说的的最短路径问题,另一个则是所谓的“流问题”。
流问题的基本概念:
首先给出一张图。

其实所谓“网络流”,其模型是非常有现实意义的。我们将该图视为计算机网络结构。此图中,s称其为源点而t称其为汇点。这个图中剩余的源泉代表网络设备,连接个顶点的边线表示连接两个设备的数据线缆,边的权值表示这条线缆能够传输的最大数据。
首先我们应该能够注意到,有向路径<s,t>就是一条传输路线,而这条传输数据的流的大小x,满足x = min{|e| | e ∈<s,t>},|e|表示边e的权值。这一点很好理解,它是基于基本的物理现实的。
通过我们已经学习过的知识,我们容易找到一条路径权值最大的<s,t>,因为我们知道最短路径怎么求嘛,最长路也是一样的。但是在这里仅仅找到一条最长路径显然是不能满足我们的需求的。因为我们发现在一个图结构中,我们仅仅通过一个最长路径进行传输,往往不如多个相对较短的路径进行“联合传输”的效果好,因此,我们现在面临的问题就是,如何找到一个网络流模型中的最大流呢?
在解决这个问题之前,我们先对这个模型进行更加量化的描述。
设此处有两个顶点u,v,定义c(u,v)表示从u到v的容量,f(u,v)表示从u到v的实际流量。基于这种定义,我们能够看出网路的流一定会满足如下的几个性质:
(1) 容量限制性:f(u,v)≤c(u,v)
(2) 流量对称性:f(u,v) = -f(v,u)
(3) 流量守恒:对于顶点u,经过该点的所有流的和为0
求解最大流的Ford-Fulkerson算法:
我们可以遍历所有的路径<s,t>,然后记录总流量,但是这样我们面临一个问题,如果在这个过程中我们访问的一条边之后便标记不再访问的话,对于某些边,当f(u,v)<<c(u,v)的时候就造成了资源的浪费,没有很好地体现出“最优”策略。因此在这里我们要很自然的引出一个新的量r<u,v>用来表示u到v剩余的流量空间,即有如下的等式成立。
r(u,v) = f(u,v) – c(u,v).
那么这样我们在每次遍历的时候,只需要在每条边的r值上做出改动,就能够很好的弥补上面的缺憾。
但是我们还是无法很好的保证这个过程的最优性,比如给出下面一个反例。

(0/2中分子表示实际流量,分母表示容量)
能够看到实线标注出来当前不满足最大流要求的路径,面对这种“岔口情况”,选择不当往往会“堵塞通路”,我们应该如何应对呢?
在这里我们巧妙的利用最大流的方向性。拿上图来举例子,当出现这种某条路径被单独孤立出去的情况时,我们假想b到a有一条路径,为什么可以这么做呢?因为如果我们想要求r(b,a),会发现有r(b,a) =f(b,a) – c(b,a) = 0 – (-1) = 1.也就是说这里<b,a>路径练一条通路都没有,但是现在却存在了大小为1的剩余流量?因为这里<a,b>的流减少就等效于<b,a>的流增加,而此前<a,b>的流恰好是1.这样我们在下次寻找通路<s,t>的时候,就对得到<s,b,a,t>这条路径,与此同时我们发现<a,b>和<b,a>之间互通流数据并没有什么意义,因此我们就可以排除掉路径<a,b>,通过这种“假想流通路”的等效方法,我们能够很好地解决搜索输出流<s,t>可能会引起的“阻隔道路”的问题。
《算法问题实战策略》-chaper32-网络流的更多相关文章
- 算法问题实战策略 PICNIC
下面是另一道搜索题目的解答过程题目是<算法问题实战策略>中的一题oj地址是韩国网站 连接比较慢 https://algospot.com/judge/problem/read/PICNIC ...
- 《算法问题实战策略》-chaper7-穷举法
关于这一章节<算法实战策略>有一段概述问题,我认为对于编程人员来说非常有价值,故在这里进行如下的摘抄: 构想算法是很艰难的工作.相比大家都经历过,面对复杂的要求只是傻乎乎地盯着显示器,或者 ...
- 《算法问题实战策略》-chaper13-数值分析
这一章节主要介绍我们在进行数值分析常用的二分.三分和一个近似求解区间积分的辛普森法. 首先介绍二分. 其实二分的思想很好理解并且笔者在之前的一些文章中也有所渗透,对于二次函数甚至单元高次函数的零点求解 ...
- 《算法问题实战策略》——chaper9——动态规划法技巧
Q1: 数字游戏: 两个人(A.B)用n个整数排成的一排棋盘玩游戏,游戏从A开始,每个人有如下操作: (1) 拿走棋盘最右侧或者最左侧的棋子,被拿走的数字从棋盘中抹掉. (2) 棋盘中还剩 ...
- 《算法问题实战策略》-chaper8-动态规划法
Q1:偶尔在电视上看到一些被称为“神童”的孩子们背诵小数点以后几万位的圆周率.背诵这么长的数字,可利用分割数字的方法.我们用这种方法将数字按照位数不等的大小分割后再背诵. 分割形式如下: 所有数字都相 ...
- 《算法问题实战策略》-chaper21-树的实现和遍历
这一章节开始介绍一个数据结构中的一个基本概念——树. 我们从数据结构的解读来解释树结构的重要性,现实世界的数据除了最基本的线性结构(我们常用队列.数组和链表等结构表征),还有一个重要的特性——层级结构 ...
- 算法问题实战策略 QUADTREE
地址 https://algospot.com/judge/problem/read/QUADTREE 将压缩字符串还原后翻转再次压缩的朴素做法 在数据量庞大的情况下是不可取的 所以需要在压缩的情况下 ...
- 算法问题实战策略 DICTIONARY
地址 https://algospot.com/judge/problem/read/DICTIONARY 解法 构造一个26字母的有向图 判断无回路后 就可以输出判断出来的字符序了 比较各个字母的先 ...
- 算法问题实战策略 MEETINGROOM 附一份tarjan模板
地址 https://algospot.com/judge/problem/read/MEETINGROOM 解答 2-sat 代码样例过了 没有ac. 我又没有正确代码对拍..... 已确认是输出 ...
随机推荐
- 动态用javascript来修改单选框性别
<script> window.onload=function(){ if(<{$data.sex}>==0){//<{$data.sex}>是在数据读出来: do ...
- centos6.3 配置NTP服务
NTP简介: NTP(Network Time Protocol)是用来使计算机时间同步化的一种协议,它可以使计算机对其服务器或时钟源做同步化,它可以提供高精准度的时间校正.本例讲解如何在CentOS ...
- HTML5中的二进制大对象Blob(转)
HTML5中的Blob对象和MYSQL中的BLOB类型在概念上是有点区别的.MYSQL中的BLOB类型就只是个二进制数据容器.而HTML5中的Blob对象除了存放二进制数据外还可以设置这个数据的MIN ...
- Android设计图(标注、切图)
1.Android: 1)Android的单位是dp 2)分为ldpi/mdpi/hdpi/xhdpi/xxhdpi. 3)分辨率对应DPI ldpi QVGA (240×320) mdpi HV ...
- Android项目代码混淆
http://coolshell.info/blog/2015/03/Android-studio-prefrence.html 什么是Gradle Gradle是一种依赖管理工具,基于Groovy语 ...
- 用java写bp神经网络(一)
根据前篇博文<神经网络之后向传播算法>,现在用java实现一个bp神经网络.矩阵运算采用jblas库,然后逐渐增加功能,支持并行计算,然后支持输入向量调整,最后支持L-BFGS学习算法. ...
- Xcode7 通过 Single View Application 得到一个 Empty Application 工程
方法: 创建一个 Empty Application 工程 下面还是详细的说一下通过一个 Single View Application 工程得到一个 Empty Application 工程的方法: ...
- XMPP基础
概要 1.即时通讯技术简介2.XMPP诞生的由来3.XMPP特点4.XMPP的基本结构5.XMPP工作原理6.XMPP的优缺点7.OSI七层模型8.IP地址.端口号.传输协议9.TCP和UDP的区别1 ...
- hibernate_validator_09
创建自己的约束规则 尽管Bean Validation API定义了一大堆标准的约束条件, 但是肯定还是有这些约束不能满足我们需求的时候, 在这种情况下, 你可以根据你的特定的校验需求来创建自己的约束 ...
- TalkingData Cocos2dx集成指南【最新】
续:最近终于腾出时间把TalkingData的Cocos版本好好折腾一下了,总感觉之前的各个版本在集成上都很蹩脚.给广大开发者带了很多困扰...“游戏正着急上线呢,哪还有时间去仔细看TalkingDa ...