上下界网络流,就是每条边既有流量上界也有流量下界的网络流。分为无源汇上下界可行流、有源汇上下界最大流、有源汇上下界最小流三种。
我们回顾网络流模型的两个关键要素:流量守恒和容量限制。流量守恒是除了源点和汇点之外点的总流量均为 \(0\) 的限制,而容量限制则是对每条边加了一个限制:不仅要小于一个 \(c_上\),还要大于一个 \(c_下\)。
想象之前学的最大流模型都是有源点汇点,并且求的最大流是源点流出的流量最大值。没有源点和汇点的时候,每个点流量都为 \(0\)。没有下界的时候图可以静如死水,也就没有什么最大流一说了。加了下界之后,网络流这张图不可以静如死水,可能必须要动起来了。这时候我们就遇到了一个问题,需要求出一个可行流。
例如这样,用 \([c_{下},c_上]\) 表示上下界,红色标注是一个可行流。
加上源点汇点之后,我们同样有求最大流环节;并且由于加上了上下界,我们还有求最小流环节。
例如这张图,最大流和最小流分别为如下两张图:
接下来我们具体讨论这三种问题怎么解决。
无源汇上下界网络流
上下界网络流是没法维护的,我们基本的想法是要把它转化为只有上界。考虑对于一条边,我们把流量和容量都减去 \(c_下\),然后最后还原的时候复原。
这样做会有一个什么错误呢?容量限制依然满足,但是流量不守恒了!这是因为,每个点删掉的出边和入边下界和之差不一定是 \(0\)。假设所有入边下界之和为 \(c_入\),出边下界之和为 \(c_出\)。原流量为 \(0\) 的点如今流量(流出-流入)为 \(c_入 - c_出\)。
这怎么办?我们其实可以考虑建立一个虚拟的源点,补充消失的流量。也就是说,要求 \(s\) 对该点有 \(c_入 - c_出\) 的流量。如果是负数,要求该点对 \(t\) 有 \(c_出 - c_入\) 的流量。
怎么处理新加流量?其实直接加为容量求最大流就好了,并且要求这个最大流必须满流。也就是说,\(s\) 连出去的每一条边都必须满流,\(t\) 连进来的每一条边都必须满流。这两个一定同时达到,因为 \(\sum \limits_{i} c_入 - c_出 = 0\)。
考虑该做法的正确性:对于新图 \(G'\)(唯一确定)和新图的一个最大流 \(f'\),对最大流只取出中间部分,每条边加上原有的下界,依然保持容量限制和流量守恒。
另外,原图的每一个可行流和新图的每一个最大流一一对应。这个不证明了。
有源汇上下界最大最小流
考虑存在源点和汇点的情况。这种情况下,我们先建一条 \(t \rightarrow s\),容量为 \(+\inf\)。然后变成无源汇上下界可行流,先求出一个可行流再说。然后直接在这个可行流上抓出原图,在残量网络上直接跑 \(s \rightarrow t\) 或者 \(t \rightarrow s\) 的最大流(取决于题目问的是最大还是最小流)。
这个为什么是对的?考虑增广路定理:对于原图 \(G\) 的一个流 \(f\),如果原图上不存在增广路,那么 \(f\) 是最大流。
那么这张图里呢?求出的流 \(f\) 是新图里的,甚至不是原图的可行流。(\(S,T\) 流量不守恒)但是我们把新图里的任意一个在 \(f\) 上寻找若干条 \(s \rightarrow t\) 的增广路得到的图中 \(t \rightarrow s\) 的那条新增边上的流量 \(f'\) 减去 \(f\),得到的是一个 \(s \rightarrow t\) 的可行流。为什么呢?
证明:首先 \(S,T\) 满流,因此减掉之后 \(S,T\) 流量不仅守恒,而且不存在流量。这样图的范围就缩减为原图的了。接着看每条边的流量。显然是增广路上的流量,所以是可行的。然后 \(s,t\) 两个点如果看成之前的无源汇,那么 \(t \rightarrow s\) 减去增广路上的对应流量即可,还是一个无源汇可行流。如果看成原图上的有源汇,那么是正常的退流/加流操作。
由于 \(|f|\) 固定,所以只需要找到一个最大的新增边上的流量 \(|f'|\) 即可。(关键边思想)
这里来一张求最小流的图,看的比较清楚。
原图:
新图:
找到的一个满流:
dinic的结果:
最小流: