基本的网络流模型:

在图论这一块初步的应用领域中,两个最常见的关注点,其一时图中的路径长度,也就是我们常说的的最短路径问题,另一个则是所谓的“流问题”。

流问题的基本概念:

首先给出一张图。

其实所谓“网络流”,其模型是非常有现实意义的。我们将该图视为计算机网络结构。此图中,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-网络流的更多相关文章

  1. 算法问题实战策略 PICNIC

    下面是另一道搜索题目的解答过程题目是<算法问题实战策略>中的一题oj地址是韩国网站 连接比较慢 https://algospot.com/judge/problem/read/PICNIC ...

  2. 《算法问题实战策略》-chaper7-穷举法

    关于这一章节<算法实战策略>有一段概述问题,我认为对于编程人员来说非常有价值,故在这里进行如下的摘抄: 构想算法是很艰难的工作.相比大家都经历过,面对复杂的要求只是傻乎乎地盯着显示器,或者 ...

  3. 《算法问题实战策略》-chaper13-数值分析

    这一章节主要介绍我们在进行数值分析常用的二分.三分和一个近似求解区间积分的辛普森法. 首先介绍二分. 其实二分的思想很好理解并且笔者在之前的一些文章中也有所渗透,对于二次函数甚至单元高次函数的零点求解 ...

  4. 《算法问题实战策略》——chaper9——动态规划法技巧

    Q1: 数字游戏: 两个人(A.B)用n个整数排成的一排棋盘玩游戏,游戏从A开始,每个人有如下操作: (1)    拿走棋盘最右侧或者最左侧的棋子,被拿走的数字从棋盘中抹掉. (2)    棋盘中还剩 ...

  5. 《算法问题实战策略》-chaper8-动态规划法

    Q1:偶尔在电视上看到一些被称为“神童”的孩子们背诵小数点以后几万位的圆周率.背诵这么长的数字,可利用分割数字的方法.我们用这种方法将数字按照位数不等的大小分割后再背诵. 分割形式如下: 所有数字都相 ...

  6. 《算法问题实战策略》-chaper21-树的实现和遍历

    这一章节开始介绍一个数据结构中的一个基本概念——树. 我们从数据结构的解读来解释树结构的重要性,现实世界的数据除了最基本的线性结构(我们常用队列.数组和链表等结构表征),还有一个重要的特性——层级结构 ...

  7. 算法问题实战策略 QUADTREE

    地址 https://algospot.com/judge/problem/read/QUADTREE 将压缩字符串还原后翻转再次压缩的朴素做法 在数据量庞大的情况下是不可取的 所以需要在压缩的情况下 ...

  8. 算法问题实战策略 DICTIONARY

    地址 https://algospot.com/judge/problem/read/DICTIONARY 解法 构造一个26字母的有向图 判断无回路后 就可以输出判断出来的字符序了 比较各个字母的先 ...

  9. 算法问题实战策略 MEETINGROOM 附一份tarjan模板

    地址 https://algospot.com/judge/problem/read/MEETINGROOM 解答  2-sat 代码样例过了 没有ac. 我又没有正确代码对拍..... 已确认是输出 ...

随机推荐

  1. 用Wget进行下载

    wget下载可以不用考虑资源的双向认证的问题,即 wget -N -S -O " + filePath + " " + urlStr + " --no-chec ...

  2. 在/etc/password用户名前面加hello,ID前加is

    方法2: #!/bin/sh #set -x file=/etc/passwd while read LINE #for i in `cat $file` do #username=`echo $i| ...

  3. 转载:C#中事件的由来

    原文地址 http://www.tracefact.net/CSharp-Programming/Delegates-and-Events-in-CSharp.aspx 感谢博主分享! 我们继续思考转 ...

  4. GIT学习(二)-->Git分布式的好处

    分布式VS集中式(版本管理系统) 集中式版本控制系统,版本库是集中存放在中央服务器的,而干活的时候,用的都是自己的电脑,所以要先从中央服务器down下最新的版本,然后开始干活,干完活了,再把自己的活推 ...

  5. FileWriter类的flush方法的作用

    FileWriter类的flush方法的作用 每次io都会影响性能,将需要写入的内容,放入缓冲区中,然后调用flush方法,将缓冲区内容写入文件中.

  6. 阿里UX矢量图标库–最强大的矢量图标库(Icon font制作力荐工具)

    继前面介绍过ICON-FONT的制作后,找了几个ICON库都是国外的今天偶然发现阿里巴巴的图标矢量库,www.iconfont.cn用了之后感觉很强大,丰富的图标库(集合阿里妈妈&淘宝的图标库 ...

  7. #BeginLibraryItem 的疑问...

    <!-- #BeginLibraryItem "/library/ur_here.lbi" --><div style="padding:3px 15p ...

  8. 使用下拉列表框<select>标签,节省空间

    下拉列表在网页中也常会用到,它可以有效的节省网页空间.既可以单选.又可以多选.如下代码: 讲解: 1.value: 2.selected="selected": 设置selecte ...

  9. <body>标签,网页上显示的内容放在这里

    在网页上要展示出来的页面内容一定要放在body标签中.如下图是一个新闻文章的网页. 在浏览器中的显示效果: 示例: <!DOCTYPE HTML> <html> <hea ...

  10. Mysql软删除

    所谓软删除(Soft Deleting),即在删除数据表中的数据时,并不直接将其从数据表中删除,而是将其标志为删除,即在每张表中设置一个删除字段(如:IsDeleted)等,默认情况下其值为0,及未删 ...