我们普通的网络流题中每条边有一个容量,或者是说每条边实际流量在[0,容量]之间
带上下界的网络流意思就是说每条边有一个最小流量和一个最大流量
问题大概分为三种
1.无源汇带上下界可行流
假设一条边是u-->v的[lower, upper],我们可以把这条边拆成两条,一条边必须流过[0, lower]的流量,另一条边可以流过[0, upper-lower]的流量。对于后者,我们发现这是普通网络流问题中的边,可以直接从u-->v连接容量为upper-lower的边。对于前者,我们可以建立一个炒鸡源src和一个炒鸡汇dest,那么这条边就钦定了u要流走lower的流量,v要流进lower的流量,那么我们可以从src到v连接一个容量为lower的边,从u到dest连接一个容量为lower的边。最后对转化的图从src到dest跑一遍最大流,检查所有src的出边是否跑满即可。我们一般叫这个为可行流。如果都跑满了,说明所有边都符合最小流量,那么存在合法的流量。否则就不存在。输出方案:对于每条边,我们输出可行流中的流量再加上最小流量即可。注意到边对于每一个点的贡献是可以累加的,我们可以一开始开一个数组统计每个点钦定流进/流出多少流量,最后统一建边即可。
- 有源汇带上下界最大流
假设原图中源点是s,汇点是t,我们可以通过新建一个炒鸡源src和一个炒鸡汇dest(和原图中的源汇不同),在原图的基础上,从t到s连一条[0, +inf]的边(因为源点的流入量是无限的,汇点的流出量是无限的),然后再跑无源汇的可行流即可判断是否可行。
如果可行,我们得到的是一个可行流,我们在可行流的基础上再从原图的s到原图的t跑一个最大流即可。
- 有源汇带上下界最小流
在有源汇带上下界最大流的基础上,由于我们需要求最小流,所以我们需要从t到s尽量地退流,所以我们跑从原图中的t到原图中的s的最大流(删去新加的t到s的边),再用可行流中新加的t到s的那个边的残量减去跑得的最大流即可。
注意答案可能存在负数(可以理解为我们跑的是从t到s的最大流,如果存在从t到s的流量的话一定会增广的),所以要和0取max