鶸鶸cosi以前做上下界网络流的题只会打板,并没有了解到算法本质。好久没有打过板的cosi今天考试果然在一道上下界最大流上挂了TAT。于是决定好好学习一下上下界网络流,下面是一些粗浅的理解,没有附代码,相信大家在众多博客中都找得到~~(雾)~~。
上下界网络流主要强调对初始流和附加流的理解,所以第一个讲解无源汇上下界可行流的篇幅会相对长一些,而后面的应用都是基于此,只是多了一些灵活套路的运用。
给定条件:一个网络中无源汇点,且每条边的流量满足给定特定条件下的上下界限制。
求任意一个满足条件的可行流,给出可行流中每条边的流量大小。
现在只需求出任意满足以上条件的流,即为该网络的可行流。
首先要满足的条件就是每条边的流量达到下界,之后再考虑为了满足流量守恒而在不溢出上界的情况下增流的方案。
可以称原始的所有边恰好达到下界(若对某一边没有特定要求即为0)的不一定满足流量守恒的流称为初始流,为了满足流量守恒而进行的适当增广添入的流所先独立形成的一个流称为附加流。两者在同一个网络下合并起来即为所求可行流。
对于初始流,只需要根据给定条件强制加上即可,我们只需要考虑如何处理附加流。
很显然可以发现,因为初始流附加流合并后的网络流量守恒,所以初始流附加流对每一个点来说其实是互补的。若初始流上某一点流入量不等于流出量,便在附加流上弥补掉这个差。
定义网络上一点 i i i的“差”为 a i a_i ai,满足 a i = i n i − o u t i a_i=in_i-out_i ai=ini−outi, i n i in_i ini是点 i i i的总流入量, o u t i out_i outi是点 i i i的总流出量。于是可以按照如下方式建立附加流。虽然原图无源汇点,但此时需要建立出附加流上的源汇点 S S SS SS, T T TT TT(满足上界限制需要,称为 S S , T T SS,TT SS,TT便于与下文有源汇点的问题区分)。
考虑三种情况:
既然对于每条限制下界的边的两个端点, a i a_i ai的增添是平衡的,那么处理完所有的点后,附加流也一定是流量守恒的。也即 ∑ i = 1 n ∣ a i ∣ ( a i > 0 ) = ∑ i = 1 n ∣ a i ∣ ( a i < 0 ) \sum _{i=1}^n |a_i| (a_i>0) = \sum _{i=1}^n|a_i|(a_i<0) ∑i=1n∣ai∣(ai>0)=∑i=1n∣ai∣(ai<0)。同时需要记录一下 ∑ i = 1 n ∣ a i ∣ ( a i > 0 ) \sum _{i=1}^n |a_i| (a_i>0) ∑i=1n∣ai∣(ai>0)的大小,便于之后判断满流。
此时还需要满足不溢出上界这个情况,然而我们知道在网络流中限制上界只需要边上加一个流量限制。于是继续处理附加网络,刚才只是对新添加的 S S , T T SS,TT SS,TT与网络中点之间的边做了处理,现在需要还原原给定条件中的边信息了。定义对边 x x x的上下界限制分别为 h i g h x , l o w x high_x,low_x highx,lowx,事实上附加网络中该边的流量上界即为 h i g h x − l o w x high_x-low_x highx−lowx,流量范围 [ 0 , h i g h x − l o w x ] [0,high_x-low_x] [0,highx−lowx]。因为初始流中已经强制达到了 l o w x low_x lowx,所以两者合并即为 [ l o w x , h i g h x ] [low_x,high_x] [lowx,highx]。
网络建立完毕,接下来以 S S , T T SS,TT SS,TT为源汇点在附加网络上跑一遍常规最大流。显然要使附加流和初始流合并后满足流量守恒, S S , T T SS,TT SS,TT向网络中点的连边必需要全部满流(这些边全部是为了达到流量守恒所添加的,同时满流之后达到上界的附加流情况也是唯一的)。
若 S S , T T SS,TT SS,TT达到满流了,必然是有解的。而此时附加流中的每一条边的流量也一定是没有超过上界的。那么我们便得到了一个可行流。
反之无解。考虑 S S , T T SS,TT SS,TT向网络中的点的连边没有全部满流,那么必然是网络中某一边满流了,也即达到了流量上界,从而限制了其它流量更大的边。既然附加网络已经漫流,而想要让 S S , T T SS,TT SS,TT与其余点的连边全部满流必然要再增加流量,是不可能的,所以无解。
最后统计可行流只需要合并一下,每条边的流量即为流量下界加上附加网络中该边流量。
给定条件:一个网络中存在源汇点 S , T S,T S,T,且每条边的流量满足给定特定条件下的上下界限制。
求任意一个满足条件的可行流。给出可行流中每条边的流量,以及网络 S − > T S->T S−>T总流量。
如果能把有源汇转为无源汇,回归到上一个问题,是不是就简单很多了呢?
只需要加一条从 T T T到 S S S的流量上限为无穷大的边即可。如果你已经掌握了上一个问题的解决方法,就可以轻松的解决了。
转化为无源汇点可行流后,每个点是流量守恒的,对于 S , T S,T S,T同样成立。那么除了可以求解原网络上每条边的流量大小外,还可以通过记录 T T T到 S S S的流入量来给出原有源汇点的网络总流量。因为总流量为 o u t S out_S outS,而无源汇图中 i n S = o u t S in_S=out_S inS=outS,而 S S S作为入度仅连接了 T − > S T->S T−>S这一条边,那么这一条有向边的反向边上的 f l o w flow flow值自然就等于原图的总流量。
给定条件:一个网络中存在源汇点 S , T S,T S,T,且每条边的流量满足给定特定条件下的上下界限制。
求满足给定条件的 S − > T S->T S−>T最大流。
不考虑最大,又回归到了上个问题,相信你又能轻松解决。
现在考虑跑完有源汇上下界可行流后的初始流附加流合并网络,可知若不考虑源汇点,是流量守恒的,那么在附加网络上再求得残余网络的 S − > T S->T S−>T最大流,这个最大流除开源汇点也是流量守恒的,那么同样也是原图的一个可行流。同时又因为求得的是残余网络的最大流,已经达到了最大。所以答案即为可行流加上残余网络的最大流。
给定条件:一个网络中存在源汇点 S , T S,T S,T,且每条边的流量满足给定特定条件下的上下界限制。
求满足给定条件的 S − > T S->T S−>T最小流。
不考虑最小,又回归到了上上个问题,相信你还是能轻松解决。
由上个问题我们可以发现,在求出一个可行流后,我们无论怎样在附加流的残余网络上增添流量,不考虑源汇点这个网络总是流量守恒的,也就是说修改以后同样是一个满足条件的可行流。
为了求得最小流,考虑求 T − > S T->S T−>S的最大流,把所有可以回溯的流都撤回,即是最小流。
撤回之前求有源汇上下界可行流时连接的 T − > S T->S T−>S这条无穷大的边,以及所有与 S S , T T SS,TT SS,TT有关的边之后,求 T − > S T->S T−>S最大流。答案即为可行流减去反向最大流。
有源汇上下界最大流:
bzoj3698:XWW的难题
有源汇上下界最小流:
bzoj2502:清理雪道