有的时候,网络流建模要考虑某些边必须选择若干次,又不能多于若干次,而且不太容易转化成比较好的限制模型,
就简单粗暴地给每条边定一个流量的上下界,求在满足上下界的基础上的一些问题。
大概有以下几种。
基本思路都是先满足下界,再调整流量守恒,一边满足最优性。
无源汇上下界可行流
每条边的流量有上下界
问是否存在一种可行方案
首先我们要保证每个点的流入流量等于流出流量
如果存在一个可行流,那么一定满足每条边的流量都大于等于流量的下限.因此我们可以令每条边的流量等于流量下限,得到一个初始流,然后建出这个流的残量网络,每条边的流量等于上限减下限。但现在可能流量不是守恒的,让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就是总流量
无源汇上下界最小费用可行流
干掉下界的时候,把费用先计算上。
把超级源超级汇求最大流的一步,换成最小费用最大流即可。
即满足合法的前提下,最小化费用。
费用就是之前的费用加上这次的费用。
例题:
有源汇上下界最小费用可行流
t到s是(inf,0)的边。
同上。
有源汇上下界(最小费用)最大流
先求可行流
现在流量已经守恒了。
拆掉t到s的边
残量网络上求s到t的最大流即可。
因为最大流过程一定满足流量守恒,所以依然合法。所以求可行流的反向边流量可以保留,支持反悔。
最大流=可行流+s到t的增加的最大流
如果涉及最小费用,把所有的最大流换成最小费用最大流即可。
记得统计三次费用。
有源汇上下界(最小费用)最小流
两种方法。
第一种:
直接类比上面的 有源汇上下界(最小费用)最大流
理解一下反边,就是反悔。
t到s的最大流,就是s到t能减少的最多的流量。
所以最后一步,求t到s的最大流。
最小流=可行流-t到s的最大流。
第二种:(并不如第一个好理解)
类似 <有源汇上下界可行流> 的构图方法,但是不添加T到S的边,求一次超级源到超级汇的最大流。
加边(T,S,0,+∞),在上一步残量网络基础上再求一次超级源到超级汇的最大流。流经T到S的边的流量就是最小流的值。 该算法的思想是在第一步中尽可能填充循环流,以减小最小流的代价。第二步最大流为了保证合法性。
其实相当于,第一步先占据一些循环流,然后再跑完第二个最大流之后,删掉t到s的边,对于一些第一步构成的循环流,删掉。
观察现在实际的图流量分配,就是最小流了。
例题: