《算法问题实战策略》-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. 我又没有正确代码对拍..... 已确认是输出 ...
随机推荐
- Android 连接 SQL Server (jtds方式)——下
本文主要补充介绍jtds的查询方法,将以博主的一个实际开发程序进行说明 下图是项目的文件列表与界面效果: 运行效果: 1.三个EditText对应的是单个计划的序号.品种名.数量 2 ...
- Angular JS API
ng function angular.bind angular.bootstrap angular.copy angular.element angular.equals angular.exten ...
- 【转】JAVA的StringBuffer类
[转]JAVA的StringBuffer类 StringBuffer类和String一样,也用来代表字符串,只是由于StringBuffer的内部实现方式和String不同,所以StringBu ...
- 跳ajax方式进行前后台交互之后台代码要怎么写
package com.zq.www.mis.action; import java.util.List; import org.apache.struts2.convention.annotatio ...
- PHP 网页爬虫
只能爬一个页面 <?php function get_urls($url){ $url_array=array(); $the_first_content=file_get_contents($ ...
- ChesFrame框架介绍
一直以来想写一个框架,想达到的目的: 1.对曾经做过项目的总结 2.节约构建系统的成本,不用每次都从零开始做起 3.写框架并在使用中不断的完善框架,这也是个积攒过程. 经历了一个多月的时间,一个基本的 ...
- 启动php-fpm报错:please specify user and group other than root
安装好PHP之后启动报错: 启动php-fpm报错:please specify user and group other than root, pool 'default 修改 php-fpm.co ...
- Python md5 sha1 的使用
版本: Python 2.7 说明: Python 内置的 hashlib 模块中有 md5 和 sha1 加密方法,可以直接使用. md5加密 import hashlib data = 'This ...
- 两个示例介绍JavaScript的闭包
JavaScript的闭包有两个用途:一个是访问函数内部的变量:另一个是让变量的值在作用域内保持不变.函数是JavaScript 中唯一有作用域的对象,因此JavaScript的闭包依赖于函数实现,下 ...
- Date.prototype.format,js下的时间格式处理函数
该方法在date的原型中扩展了format方法,使其可以方便的格式化日期格式输出. Date.prototype.format =function(format) { var o = { , //mo ...