有上下界限制的网络流-总结

有上下界限制的网络流

 

模型


给定一个网络,一个加权的有向图G,其中的每条边都有一个容量上界C。其中的两点:S只有出度没有入度,T只有入度没有出度。求S到T最大可以流过的流量,这是最大流的模型。
且满足以下条件:

  • 容量限制:每条边的流量$0\leq f\leq C$ 
  • 流量平衡:任意一个点i,$\sum\limits_{(u,i)\in E}f(u,i) = \sum\limits_{(i,v)\in E}f(i,v)$

那么f是G的一个可行流。最大流即满足容量限制和流量平衡的最大的流。

如果在网络中,每条边增加一个流量下界B,这就是有上下界限制的网络流的模型了。
那么有上下界限制的网络流也是满足两个条件:

  •  容量限制:每条边的流量$B\leq f\leq C$
  •  流量平衡:任意一个点i,$\sum\limits_{(u,i)\in E}f(u,i) = \sum\limits_{(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的流量。但是初始流可能会不满足流量平衡。即可能存在:

$\sum\limits_{(u,i)\in E}B(u,i) \neq \sum\limits_{(i,v)\in E}B(i,v)$

那么我们加上一个$g$(附加流)是其满足流量平衡。

$\sum\limits_{(u,i)\in E}[B(u,i)+g(u,i)] = \sum\limits_{(i,v)\in E}[B(i,v)+g(i,v)]-----(1)$

$B + g$ 也就是实际的流量$f$。

此时我们去掉了流量下界限制B,那么网络中每条边的容量上界限也要减去,已经流过了B的流量,即新网络图中每条边的流量上界限制为$C' = C - B $,下界限制0。

 

用最大流求解(求解附加流):

将(1)式移项:

$\sum\limits_{(u,i)\in E}B(u,i)-\sum\limits_{(i,v) \in E}B(i,v) = \sum\limits_{(i,v)\in E}g(i,v) - \sum\limits_{(u,i)\in E}g(u,i)$

 $M(i) = \sum\limits_{(u,i)\in E}B(u,i)-\sum\limits_{(i,v) \in E}B(i,v)$ 

原式:

$M(i) = \sum\limits_{(i,v)\in E}g(i,v) - \sum\limits_{(u,i)\in E}g(u,i)$

M(i)是已知的,i点的流入的下界之和减流出的下界之和。

 

1、如果$M(i) \geq 0$

$\sum\limits_{(i,v)\in E}g(i,v) = \sum\limits_{(u,i)\in E}g(u,i)+ M(i)$

那么我们发现附加流中流出的需要比流入的多M(i)才可以达到流量平衡,那么这些流从哪来呢。建一个源点SS,建一条从SS到i的边,容量为$M(i)$。

2、如果$M(i) \leq 0$

$\sum\limits_{(i,v)\in E}g(i,v) - M(i) = \sum\limits_{(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点流量平衡,哪会有多余的流量流给其他点呢?

无源汇上下界网络流到此求解完成。

例题:SGU 194. Reactor Cooling

 

 

有源汇上下界可行流

 

有源汇上下界可行流相比有源汇上下界可行流,多了源点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,判断是否可行即可。

 

无源汇上下界最大流到此求解完成。

例题:loj #116. 有源汇有上下界最大流

 

有源汇上下界最小流

这个相比上面就是求最小流了。

 

同样,先判断是否有解。之后求一遍T到S的最大流,用可行李减去最大流。考虑反向边的增加量是表示正向边的减少量,所以求出从T到S的最大减少量就是最小流了。

代码实现:判断可行流,删T->S的边,求一遍T到S的最大流,answer=可行流-最大流。

 

无源汇上下界最小流到此求解完成。

例题loj #117. 有源汇有上下界最小流

 

posted @ 2018-02-25 14:37  MJT12044  阅读(2213)  评论(11编辑  收藏  举报