有上下界限制的网络流
模型
给定一个网络,一个加权的有向图G,其中的每条边都有一个容量上界C。其中的两点:S只有出度没有入度,T只有入度没有出度。求S到T最大可以流过的流量,这是最大流的模型。
且满足以下条件:
- 容量限制:每条边的流量$0leq fleq C$
- 流量平衡:任意一个点i,$sumlimits_{(u,i)in E}f(u,i) = sumlimits_{(i,v)in E}f(i,v)$
那么f是G的一个可行流。最大流即满足容量限制和流量平衡的最大的流。
如果在网络中,每条边增加一个流量下界B,这就是有上下界限制的网络流的模型了。
那么有上下界限制的网络流也是满足两个条件:
- 容量限制:每条边的流量$Bleq fleq C$
- 流量平衡:任意一个点i,$sumlimits_{(u,i)in E}f(u,i) = sumlimits_{(i,v)in E}f(i,v)$
有上下界限制的网络流一般分为三类:
- 无源汇有上下界可行流
- 有源汇有上下界最大流
- 有源汇有上下界最小流
下面分别阐述其求法
预备知识
B(u,v): u->v的流量下界
C(u,v): u->v的流量上界
f(u,v): u->v的流量
无源汇上下界可行流
顾名思义,无源汇上下界可行流:没有源点S,汇点T。在网络中求可行流或者指出不存在。
对于这个问题,不好处理,但是如果我们去掉流量下界限制B,那么就是最大流的模型了,问题就可以解决了。
直接去掉B是不对的。我们规定初始流:每条边先流过B的流量。但是初始流可能会不满足流量平衡。即可能存在:
$sumlimits_{(u,i)in E}B(u,i) eq sumlimits_{(i,v)in E}B(i,v)$
那么我们加上一个$g$(附加流)是其满足流量平衡。
$sumlimits_{(u,i)in E}[B(u,i)+g(u,i)] = sumlimits_{(i,v)in E}[B(i,v)+g(i,v)]-----(1)$
$B + g$ 也就是实际的流量$f$。
此时我们去掉了流量下界限制B,那么网络中每条边的容量上界限也要减去,已经流过了B的流量,即新网络图中每条边的流量上界限制为$C' = C - B $,下界限制0。
用最大流求解(求解附加流):
将(1)式移项:
$sumlimits_{(u,i)in E}B(u,i)-sumlimits_{(i,v) in E}B(i,v) = sumlimits_{(i,v)in E}g(i,v) - sumlimits_{(u,i)in E}g(u,i)$
令 $M(i) = sumlimits_{(u,i)in E}B(u,i)-sumlimits_{(i,v) in E}B(i,v)$
原式:
$M(i) = sumlimits_{(i,v)in E}g(i,v) - sumlimits_{(u,i)in E}g(u,i)$
M(i)是已知的,i点的流入的下界之和减流出的下界之和。
1、如果$M(i) geq 0$
$sumlimits_{(i,v)in E}g(i,v) = sumlimits_{(u,i)in E}g(u,i)+ M(i)$
那么我们发现附加流中流出的需要比流入的多M(i)才可以达到流量平衡,那么这些流从哪来呢。建一个源点SS,建一条从SS到i的边,容量为$M(i)$。
2、如果$M(i) leq 0$
$sumlimits_{(i,v)in E}g(i,v) - M(i) = sumlimits_{(u,i)in E}g(u,i)$
同理,发现附加流中流入的需要比流出的多M(i)才可以达到流量平衡。建一汇点TT,建一条从i到TT点边,容量$-M(i)$,容量也就变成正的了。
建图完毕。从SS到TT跑一遍最大流即可。原图中存在解的条件是:每条从SS连出的边与连向TT的边都需要满流。
问题:
1、为什么从SS连出的边与连向TT的边满流后才存在解,不满流就不存在解?
设从SS连出的边其中一条指向i,容量M。思考连这条边是因为a的下界B中流入的(B1)大于流出的(B2)。因为在网络图中已经流了下界的流量,所以附加流中i的出边要增加一些流量,以达到实际网络图中的流量平衡。这些增加的流量就是从这条边流来,如果这条边未满流,那么说明i的所有出边已经无法再流M的流量了,也就是a的所有出边的流出的最大值,不及入边的最小值B1,因此不存在解。
相反,如果满流,那么说明这个点至少是可以达到流量平衡了,且满足了容量限制,那么所有的边都满流,就是有解了。
对于连向TT的边,同理。
2、还有一个小问题,会不会S到i的边未满流,但是另一指向i的边使a流量平衡了。
但是仔细想一下,这是不可能存在的。最大流从S开始跑,整个图中的流量都是从S出发的,而对于S出发的指向i的一条边,它刚好使得i点流量平衡,哪会有多余的流量流给其他点呢?
无源汇上下界网络流到此求解完成。
有源汇上下界可行流
有源汇上下界可行流相比有源汇上下界可行流,多了源点S和汇点T,求从S到T满足每条边的流量都满足限制,且除S,T,其他点都满足流量平衡。因为只有S和T不满足流量平衡,所以,如果可以使S,T也满足流量平衡,那么就可以直接套用无源汇上下界可行流了。
那么具体如何操作呢?
源点的性质是只有流出的没有流入的,汇点恰好相反,而且对于源点流出的和汇点流入的,这些流量是相等的。所以建一条从T到S的边容量为INF,那么流入汇点的流量就会从这条边流入S。有源汇到无源汇转换完成,跑一遍从SS到TT的最大流即可。可行流的流量也就是这条边的流量。
无源汇上下界可行流到此求解完成。
无源汇上下界可行流没有例题,因为在下面两个中都会用到。
有源汇上下界最大流
有源汇上下界最大流与有源汇上下界可行流相比,不只是可行流,而且要最大。依然每条边满足容量限制,除源点汇点满足流量平衡。
首先,前提是必须有可行流,所以先套用有源汇上下界可行流来判断是否有解。如果没解就直接输出,有解继续往下看。然后,判断后的残量网络上跑一遍从S到T的最大流,让还有自由流的边多流一些,然后将可行流与这次的最大流相加即可。
为什么这样可以求出最大流?
SS连出的所有边,容量都是流入的下界之和-流出的下界之和,所以当这些边都满流时,说明这些点实际流出的流量=流入的下界之和。那么流入的上界可能并没有达到。对于连向TT的边同样是这样。所以在残余网络上,可能可以继续流一些的,从S到T的最大流,刚好把这些流量全加上。此时再加上可行流,就是最大流。
这样做会不会不满足流量限制了?
在原图中SS,TT的边已经满流了,而且最后的最大流,是不经过这些边的,无法改动这些边的。
代码实现(两种方法):
1、判断可行流,删除T->S的边,求S到T的最大流,answer=可行流+最大流。
2、判断可行流,求S到T的最大流,answer=最大流。仔细一想就明白了,T->S这条边不可能走,而它的反向边S->T容量(可行流)是要走的,所以可行流的流量会从S->T增广到T。
还有一种求解的方法:
在判断可行流时,增加了一条T->S的边,B=0,C = INF。如果存在可行流,那么T->S这条边的容量就是可行流的流量,假设这个流量为a。所以,每次我们可以给a一个值,如果存在解,那么说明这个值是可行的,所以二分a,判断是否可行即可。
无源汇上下界最大流到此求解完成。
有源汇上下界最小流
这个相比上面就是求最小流了。
同样,先判断是否有解。之后求一遍T到S的最大流,用可行李减去最大流。考虑反向边的增加量是表示正向边的减少量,所以求出从T到S的最大减少量就是最小流了。
代码实现:判断可行流,删T->S的边,求一遍T到S的最大流,answer=可行流-最大流。
无源汇上下界最小流到此求解完成。