1.无源汇点上下界可行流
一个无源汇点网络流就相当于一个循环流,流量在这个循环中一直流动,它的最大流就是单位时间的最大流量.
那么对于无源汇上下界网络流是否有可行解,也就是满足每个边的流量都至少是它的下界,并且保证所有点的"流量守恒"就是有解.
那么我们就想办法将有上下界转化为无上下界问题,也就相当于下界为0,那么转化为无上下界网络流它的边的容量就变为(上界值-下界值).如此转化会造成新的网络没有"流量守恒",因为我们的转化就相当于将每个边都先减去下界的流量,也就是保证了会流出至少下界的流量.
那么对于一个边的上下界,令du[i]为(i点的入流量-出流量),边的入流端j,d[j]加下界值,出流端i,d[i]减去下界值.
建立源点S,汇点T.
如果du[i]>0表示入流大于出流.那么建立S->i的边容量为du[i]
如果du[i]<0表示出流大于入流,那么建立i->T的边容量为du[i]
那么对于源点为S,汇点为T的新的网络流跑最大流flow,如果flow==∑du[i]>0,说明对S和T连的额外边都可以满流,也就是原图所有边都至少有下界的流量时可以满足"流量守恒".那么此时无源汇点上下界网络流就有可行解(但是求出的并非最大解(流))
2.有源汇点上下界最大流
首先我们需要判断有源汇上下界网络流是否有可行流.那么就需要将有源汇点转化为无源汇点问题.
①建立汇点T->源点S容量为inf的边,将有源汇变为无源汇
②建立超级源点SS,超级汇点TT
现在就与无源汇上下界网络流相同,对(SS,TT)跑最大流看是否有解.
如果有可行流,那么对刚刚建立的汇点T->源点S的边的反向边[S->T]的流量就是可行流的流量.
都是此时求出的流量并非最大流,因为前面已经说过无源汇点上下界网络流只求出了可行流并非最大流,所以还要再对残量网络跑一边(S->T)的最大流,两者相加就是了(如果不将建立的T->S的边删去,直接跑(S->T)最大流时会加上[S->T]的可行流流量,所以跑完可行流再跑一遍最大流的结果就是答案了).
3.有源汇点上下界最小流.
当然前提依然是要有可行流.
建立超级源点SS,超级汇点TT
第一种方法:
建立T->S的容量为inf的边.那么再跑无源汇可行流时要求有源汇点上下界最小流也就是使得[S->T]值尽量小
那么我们可以先不建立T->S的边,跑一边(SS,TT).
然后再加入T->S,在跑一边(SS,TT)得到[S->T]的值就是最小流了.
可以理解为先不加入T->S边,现在也就没有S->T的流量值.
让其他流量路径先跑完,之后再加入T->S,就可以把T->S的贡献减到尽量小.
第二种方法:
跑无源汇上下界可行流求出S->T的流量,那么最小流一定是小于等于这个值.
之后再跑(T,S)最大流,根据反向边的性质,(T,S)最大流也就是增加了(S,T)的流量.
所以在跑完可行流的基础上再跑(T,S)求出再次基础上还能最多减少多少S->T的流量