[学习笔记]上下界网络流

有的时候,网络流建模要考虑某些边必须选择若干次,又不能多于若干次,而且不太容易转化成比较好的限制模型,

就简单粗暴地给每条边定一个流量的上下界,求在满足上下界的基础上的一些问题。

大概有以下几种。

基本思路都是先满足下界,再调整流量守恒,一边满足最优性。

 

无源汇上下界可行流

每条边的流量有上下界
问是否存在一种可行方案

 

首先我们要保证每个点的流入流量等于流出流量
如果存在一个可行流,那么一定满足每条边的流量都大于等于流量的下限.因此我们可以令每条边的流量等于流量下限,得到一个初始流,然后建出这个流的残量网络,每条边的流量等于上限减下限。
但现在可能流量不是守恒的,让t[i]=流入量-流出量
我们建出虚拟的源点和汇点,如果t[i]>0,源点向i连t[i]的边,否则i点向汇点连-t[i]的边,看是否满流即可

 

注意,把下界干掉时,不是真的流过去,反向边不用动。因为这里不能反悔。

 

有源汇上下界可行流

T到S连一条inf的边e。然后同上。

设e的最终流量是w,则原图的可行流就是w

证明:

S,T本身没有入边、出边,那么e的流量就是S流出的,流到T的流量。

拆掉这个边,每个边流量加上下界

由于剩下的图中,满足流量守恒和上下界,那么一定是一个合法的网络流流量分配,那么S流出的流量w就是总流量

 

无源汇上下界最小费用可行流

干掉下界的时候,把费用先计算上。

把超级源超级汇求最大流的一步,换成最小费用最大流即可。

即满足合法的前提下,最小化费用。

费用就是之前的费用加上这次的费用。

例题:[NOI2008]志愿者招募

 

有源汇上下界最小费用可行流

t到s是(inf,0)的边。

同上。

 

有源汇上下界(最小费用)最大流

先求可行流

现在流量已经守恒了。

拆掉t到s的边

残量网络上求s到t的最大流即可。

因为最大流过程一定满足流量守恒,所以依然合法。所以求可行流的反向边流量可以保留,支持反悔。

最大流=可行流+s到t的增加的最大流

 

如果涉及最小费用,把所有的最大流换成最小费用最大流即可。

记得统计三次费用。

 

有源汇上下界(最小费用)最小流

https://blog.csdn.net/Hanks_o/article/details/77995557

两种方法。

第一种:

直接类比上面的 有源汇上下界(最小费用)最大流

理解一下反边,就是反悔。

t到s的最大流,就是s到t能减少的最多的流量。

所以最后一步,求t到s的最大流。

最小流=可行流-t到s的最大流。

 

第二种:(并不如第一个好理解)

类似 <有源汇上下界可行流> 的构图方法,但是不添加T到S的边,求一次超级源到超级汇的最大流。
加边(T,S,0,+∞),在上一步残量网络基础上再求一次超级源到超级汇的最大流。
流经T到S的边的流量就是最小流的值。


该算法的思想是在第一步中尽可能填充循环流,以减小最小流的代价。

第二步最大流为了保证合法性。

其实相当于,第一步先占据一些循环流,然后再跑完第二个最大流之后,删掉t到s的边,对于一些第一步构成的循环流,删掉。

观察现在实际的图流量分配,就是最小流了。

 

例题: P4843 清理雪道

 

posted @ 2018-12-17 17:08  *Miracle*  阅读(296)  评论(0编辑  收藏  举报