网络流学习-Ford-Fulkerson
首先我们先解决最大流问题
什么是最大流问题呢
根据我的理解,有一个源点s,汇点t,s可以通过一个网络(雾)流向汇点t
但是每一条边都有他的最大传输容量限制,那么我们的任务是,如何分配流量使得。。从s流向t的流量最大化
并且由于流量并不存在损失,所以非常重要的一点是收到的流量与发出的流量都相等,对于除了s,t的任何点来说都要成立,否则我们认为这不科学
首先该网络图是一个有向图,图中的每条边e,都有对应最大可能的数据传输量c(e),这样就可以把问题转为如下形式
记每条边对应的实际数据传输量为f(e)
传输量应满足如下性质,0<=f(e)<=c(e)
对于任意v属于V\{s,t},他们所有点的收到的数据量和发送的数据量相等
为什么这个是正确的呢,因为如果记出去流量为cf,收到流量为sf,对于除了s,t的每一个点,cfi=sfi,那么最终的和式一定是,cfi+...+cfn=sfi+...+sfn
每次两边都加上相等的两个值。。或者说一堆等式相加,,最后一定还是一个等式
目标是最大化从s发出的流量
首先考虑这样一个贪心算法
找到一条s到t的只经过f(e)<c(e)的边的路径
如果不存在满足条件的路径,则结束算法。否则,沿着路径尽可能地增加合法的符合约束的流量f(e),返回第一步
但是我们知道这样是具有后效性的。。也就是说如果你找了不是最优的路径,那么你不能反悔
由于是邻接表。。这里可以认为你找到的路径是跟输入同样随机的。。。你怎么能确定你的流量分配路径最优呢
如何解决这个问题呢。。
只利用满足f(e)<c(e)的e或者满足f(e)>0的e对应的反向边rev(e),寻找一条s到t的路径
如果不存在满足条件的路径则结束。否则沿着该路径尽可能地增加流,返回第一步。
我们称f(e)<c(e)的e和满足f(e)>0的e对应的反向边rev(e)所组成的图为残余网络,并称残余网络上s-t的路径为增广路
实现方面。。我们可以不记录每条边流过的流量的状态,取而代之的是我们可以直接改变其边的容量c(e)
记最大流的流量为F,那么Ford-Fulkerson算法至多进行F次dfs,所以其复杂度为O(F|E|)不过这是一个很松的上界
达到这种复杂度的情况基本不存在。。实际应用还是挺好的。。
那么我们如何证明上面的做法是正确的呢
为了证明FF算法所求得的确实是最大流,我们首先介绍割这一概念,所谓图的割,指的是对于某个顶点集合S属于V
从S出发指向S外部的那些边的集合,记为割(S,V\S),这些边的容量之和被称为割的容量。如果有s属于S,而t属于V\s
(我们在前面已经说过了s是源点,t是汇点)
那么此时的割又称为s-t割。
如果将网络中s-t割中所包含的边都删去,也就不再有s到t的路径了,因此可以考虑一下如下问题。
对于给定网络,为了保证没有从s到t的路径,需要删去的边的总容量的最小值是多少?
该问题又被称为最小割问题。事实上,这个问题与之前最大流的问题有着很深的联系
首先,让我们来考虑一下任意的s-t流f(s-t的一条流量路径),和任意的s-t割(S,V\S),而这个则是一个边集,前面则是一个路径集合
因为有f(路径流量集合)的流量=(s的出边的总流量)
而对v属于S\{s}又有(v的出边的总流量)=(v的入边的总流量),为什么不除去t呢。。因为t属于V\S
所以有(f的流量)=s的出边的流量+v的出边的总流量-(s的入边的流量(这一项其实等于0)+v的入边的总容量)
所以我们合并一下就能发现(f的流量)=S的出边总流量-S的入边总流量
由于存在V\S->S的入边。。所以实际上f的流量=割的容量-前面说的V\S->S入边的流量,
由于我们考虑的流量都是大于零的,所以此时可以推出结论f的流量<=割的容量
接下来,考虑通过FF算法所求得的流f'。记流f'对应的残余网络中从s可达的顶点v组成的集合为S(注意这里的定义更换)
因为f'对应的残余网络不存在s-t的路径,因此(S,V\S)就是一个割,(深度较深的点V\S刚好可能没有连边,然而这也是合法的)
此外根据S的定义,对包含在割中的边e应该有f'(e)=c(e)这一点我们可以通过S的定义来进行反证
而对V\S到S的边e应该有f'(e)=0,这个怎么证明呢。。如果这个f'(e)!=0,则说明它的反向边的容量S->V\S的容量不是满的。。
如果不是满的我就应该把那个点加入到S集合中来,这与S的定义相矛盾。。
因此f'的流量=(S的出边的流量(割的流量))-(S的入边的总流量(前面证明了这个部分的流量一定是0))=割的容量
再由之前的之前的不等式可知(任意f的流量<=割的容量),现在等于割的容量。。就证明了这个流f'就是最大的流了
于是我们证明了FF算法的正确性,同时还推导出了最大流等于最小割这一重要性质,该性质又被称为最大流最小割定理
根据该定理我们可以直接利用求解最大流问题的算法来求解最小割问题了。
由FF算法的正确性可以知道,如果所有边的容量都是整数,那么最大流和最小割也是整数
网络流学习-Ford-Fulkerson的更多相关文章
- ACM/ICPC 之 网络流入门-Ford Fulkerson与SAP算法(POJ1149-POJ1273)
第一题:按顾客访问猪圈的顺序依次构图(顾客为结点),汇点->第一个顾客->第二个顾客->...->汇点 //第一道网络流 //Ford-Fulkerson //Time:47M ...
- 网络流学习(转载自ssw 的博客)
众所周知,网络流是探究网络上运输的一种图论分支.但是大多数人在第一次接触这个题时都有些畏惧感(比如说我),大佬可以自信跳过.. 本文包括: 1.网络流的概念及基本性质 2.略谈 Edmonds-Kar ...
- 【2018.2.8-】网络流学习笔记(含ISAP!)
网络流的基础内容就不详细发了,网上到处都是,可自学. 总版点这里 ps:以下有些链接是hihocoder的题目(题面有详细讲解),请确保先登录hihocoder,再点击进入相应题目网页. 最大流 基础 ...
- 网络流学习 - dinic
推荐博客:https://www.cnblogs.com/SYCstudio/p/7260613.html#4246029
- NOIp 图论算法专题总结 (3):网络流 & 二分图 简明讲义
系列索引: NOIp 图论算法专题总结 (1) NOIp 图论算法专题总结 (2) NOIp 图论算法专题总结 (3) 网络流 概念 1 容量网络(capacity network)是一个有向图,图的 ...
- Python小白的数学建模课-19.网络流优化问题
流在生活中十分常见,例如交通系统中的人流.车流.物流,供水管网中的水流,金融系统中的现金流,网络中的信息流.网络流优化问题是基本的网络优化问题,应用非常广泛. 网络流优化问题最重要的指标是边的成本和容 ...
- POJ1459 Power Network 网络流 最大流
原文链接http://www.cnblogs.com/zhouzhendong/p/8326021.html 题目传送门 - POJ1459 题意概括 多组数据. 对于每一组数据,首先一个数n,表示有 ...
- 【上下界网络流】bzoj2502: 清理雪道
模型:无源汇有上下界可行流 LJN:模板题吧 Description 滑雪场坐落在FJ省西北部的若干座山上. 从空中鸟瞰,滑雪场可以看作一个有向无环图,每条弧代表一个斜坡(即雪道),弧的 ...
- 最小割&网络流应用
重要链接 基础部分链接 : 二分图 & 网络流初步 zzz大佬博客链接 : 网络流学习笔记 重点内容:最小割二元关系新解(lyd's ppt) 题目:网络流相关题目 lyd神犇课件链接 : 网 ...
随机推荐
- ECharts特效-折线图上一个光点来回移动
参考地址:https://www.makeapie.com/editor.html?c=xxxcG6NGk0 效果图打开上面的网址就可以看到. 核心代码如下,该效果实现的难点是数据的封装,还有eval ...
- Zabbix监控虚拟机服务-告警与自动恢复-模板化
上一篇文章测试了服务的告警与自动恢复:Zabbix监控虚拟机服务-告警与自动恢复 但是我是直接为某一个主机增加的监控项和触发器, 如果要让某一个自定义的监控项和触发器被很多机器共用,则需要创建模板 1 ...
- JavaScript——深入了解this
前言 我曾以为func()其实就是window.func() function func(){ console.log('this : ' + this); } func();//this : [ob ...
- 接口新建学习---HTTP请求默认值
一.HTTP请求默认值 1.使用场景: 每次访问论坛的地址(服务器名称或IP)是不变的,端口也是不变的,协议也是不变的(http协议),测试的时候需要每个请求都要写一遍,在我们的HTTP请求取样器数量 ...
- ES 2021 来了,详细解读5个新特性,附案例
ES 2021是世界上最受欢迎的编程语言的最新版本〜 本次迭代中包含了五个新特性,让我们来一睹为快. 1.全部替换replaceAll: js默认的replace 方法仅替换字符串中一个模式的第一个实 ...
- GRASP职责分配模式
https://mp.weixin.qq.com/s/IaxAnWfVqe3mM0bHFVV5Gg 软件开发必修课:你该知道的GRASP职责分配模式 原创 悟真 阿里技术 今天 收录于话题 #设计模式 ...
- 异步日志 Loguru
https://mp.weixin.qq.com/s/hy68s610B9GbL_wgwTn7nA 更优美的python日志管理库Loguru Asynchronous, Thread-safe, M ...
- 8.3 Customizing Git - Git Hooks 钩子 自动拉取 自动部署 提交工作流钩子,电子邮件工作流钩子和其他钩子
https://git-scm.com/book/en/v2/Customizing-Git-Git-Hooks https://github.com/git/git/blob/master/temp ...
- SpringMVC听课笔记(三:使用@RequestMapping映射请求)
1. Spring MVC使用 @RequestMapping 注解为控制器指定可以处理哪些URL请求 2. 标注点: --类定义处:提供初步的请求映射信息.相对于WEB应用的根目录 --方法处:提供 ...
- VMware虚拟机串口与宿主机进行传输验证
一.验证目的 1.验证VMWARE虚拟机(Windows或Linux)上的程序,是否可以读取宿主服务器的物理串口中的数据. 二.验证过程 1.验证条件及工具, 宿主机:Windows 10 x64 V ...