自己对有上下界的网络流的理解
2014-08-14 16:11
246 查看
首先说一下,什么是上下流,上下流也就是有上下界的网络流,正常的网络流都是只有上界,没有下界,但是当有下界限制的时候就可能出现因不能满足所有下界而无解的情况,这种问题一般分为三种问法,有源/无源可行流判断,有源最大流,有源最小流,首先先说下怎么处理上下界,首先对于一条边 from to min max,我们可以把他拆成两个部分,第一部分就是 from->to max-min ,max - min是除了限制以外可以自由流动的流量,我们可以简单的叫他自由边,然后第二部分有两部分组成,首先虚拟超级源点ss,超级汇点tt,然后建边from
-> tt min 和 ss -> ss min,这么建边的原因是在流中,任何点的入流量都必须等于出流量,对于这两条边是必须流满的,所以叫必须边,如果有一条边没有流满,那么就是没有可行解。因为最后所有的点必须满足入流等于出流。
(1)有源/无源可行流判断
这个是最基础的,无论哪种问法都必须要先判断是否可行,对于有源的,我们可以直接建立一条边t -> s 0 inf ,这样就把有源变成了无源,对于无源的可行流判断,我们只要按照上面的建边拆边方式建图之后,跑一遍ss到tt的最大流,如果所有必须边都满流,那么就是有解,否则无解,如果要输出答案,在残余网络中找到非必须边,非必须边的流量加上该边的下限就行了(因为下限已经满流).
(2)有源最大流
首先要做(1)那样的处理,如果判断有解了,s,t之间的流量,尤其是自由边的流量有可能没有用完,我们直接在残余网络上跑一遍s,t的最大流,最后答案就是当前的这个流量+所有的下限。
(3)有源最小流
这个比较特别,我还没有见过这样的题目,可以分三个步骤处理
(1)先不加t->s,跑一遍 ss -> tt的最大流记为f1,目的是为了让所有的必须边都尽可能的满流。
(2) 然后直接在残余网络上添加 t->s 0 inf 的边,把当前的边记为w
(3) 然后在跑一遍 ss -> tt的最大流,记为f2
如果所有的必须边都满流了,那么w这条边的流量就是s的入流量,也是出流量,也是s流出去的最小流。至于为什么,其实我也不是很清楚,但我现在唯一的理解就是,一开始不建t->s是为了尽可能的不浪费s的出流量(因为不建,入流量就是0),保存实力,跑一遍之后,把用到的别人的力量全都用完了,然后在t->s,然后在跑一遍,这样应该是s所流出的东西是尽可能最小的了吧,又因为 入=出,所以s流出的等于w的流量,等于s到t的最最小流。
相关文章推荐
- 创新源于理解 轻松打造自己的AJAX框架
- 网络流(最大流、最小费用最大流、有上下界的网络流)
- 删除数据库中重复记录(添加自己的理解)
- 【SGU194&ZOJ2314】Reactor Cooling(有上下界的网络流)
- 谈谈自己对js闭包,执行上下文,作用域链,活动对象AO,变量对象VO的理解
- spring经典笔记(部分内容来自一个技术公众号整合了自己的理解)
- 浅谈自己对构造函数、析构函数、复制构造函数的理解
- 自己理解的Android广播机制
- 【BZOJ2502】清理雪道 有上下界的网络流 最小流
- 软件测试能力模式(自己理解)
- 读软件架构师应该知道的97件事的自己理解
- 动态规划背包问题自己的理解:
- C语言深度解剖(精讲版)——读书笔记11 &&自己的一些理解
- C语言深度解剖(精讲版)——读书笔记16 &&自己的一些理解
- Html的Padding,Margin自己理解图
- 软件开发人员该如何深入理解自己的代码
- 自己对于圣杯布局和双飞翼布局的一些理解
- [学习笔记]Java代码构建一个线程池的自己学习写的实例,用这个你会更好的理解文章内容
- 今后尽量多看点开源代码,并将自己的理解详细的分享出来
- [笔记]有上下界的网络流笔记