基本的网络流模型:

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

流问题的基本概念:

首先给出一张图。

其实所谓“网络流”,其模型是非常有现实意义的。我们将该图视为计算机网络结构。此图中,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. Android中使用HttpGet和HttpPost访问HTTP资源

    需求:用户登录(name:用户名,pwd:密码) (一)HttpGet :doGet()方法//doGet():将参数的键值对附加在url后面来传递 public String getResultFo ...

  2. C# 邮件发送注意事项

    使用QQ邮箱作为smtp服务器时,遇到 "命令顺序不正确. 服务器响应为: AUTH first..",解决办法: smtpClient.UseDefaultCredentials ...

  3. Have trouble in your life

    当你烦恼的时候不知道如何是好时,你可以下载此程序,可以帮助你化解烦恼! 下载地址: http://pan.baidu.com/s/1i3FtxHF

  4. sqlserver2008附加数据库——错误3415

    权限问题, 在其文件,右击属性>安全>编辑>添加>加一个everyone单击确定>其完全控制, 这样给每个用户权限 ---来自凌波小屋----冯和超笔记-----

  5. web前端对上传的文件进行类型大小判断的js自定义函数

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  6. CSP内容安全策略

    在浏览网页的过程中,尤其是移动端的网页,经常看到有很多无关的广告,其实大部分广告都是所在的网络劫持了网站响应的内容,并在其中植入了广告代码.为了防止这种情况发生,我们可以使用CSP来快速的阻止这种广告 ...

  7. Protostuff自定义序列化(Delegate)解析

    背景 在使用Protostuff进行序列化的时候,不幸地遇到了一个问题,就是Timestamp作为字段的时候,转换出现问题,通过Protostuff转换后的结果都是1970-01-01 08:00:0 ...

  8. 重拾C++ 基础知识总结(二)

    1.标准库string类型: 用户程序要使用string类型对象,必须包含相关头文件 #include <string> 字符串字面值与标准库string类型不是同一种类型,字符串字面值是 ...

  9. python正则表达式入门

    基本概念 使用正则表达式需要import re 表达式前加r避免转义 \d代表数字,\s代表空白字符,\w代表字母+数字. .代表任意单个字符 {m,n}代表前面字符至少出现m次,最多出现n次. (x ...

  10. jquery元素查找方法

    $("#myELement") 选择id值等于myElement的元素,id值不能重复在文档中只能有一个id值是myElement所以得到的是唯一的元素 $("div&q ...