有上下界网络流问题

有上下界网络流

有上下界的网络流即是在普通的网络流的基础上,额外添加每条边流量的限制。

普通的网络流可以认为是特殊情况的上下界网络流,即流量限制为(f_iin [0,maxflow])

而现在,我们要求的每条边的容量限制为(f_iin [B_i,C_i])

这类问题我们大致可以分成三类。

无源汇 上下界可行流

因为没有源点和汇点,所以所有点都要满足流量平衡。

如果我们能够不考虑下界的话,就直接可以照搬最大流。

因为下界是一定要流满的,所以我们先强制所有边流满下界,只考虑剩下的流量(g_i)

那么,也就是对于每一个点(x),都要满足流量平衡的方程:

[sum B_{(x,v)}+sum g_{(x,v)}=sum B_{(u,x)}+sum g_{(u,x)} ]

如果能够满足这个方程的话,每条边流量为(B_i+g_i)即是一组可行流。

考虑将流量分类,因为(B)是已知量,所以移项考虑左侧(B)和右侧(g)

假设左侧(M(x)=sum B_{(u,x)}-sum B_{(x,v)})

所以变成了需要满足(M(x)=sum g_{(x,v)}-sum g_{(u,x)})

因为不知道谁大谁小,所以按照(M)大小进行分类讨论

如果(M(x)ge 0),那么有(sum g_{out}=sum g_{in}+M)

也就是流出需要比流入的流量要多(M),但是需要满足流入等于流出。

所以建立一个超级源,连边((S,x)),容量为(M),来补足流入少的(M)

反之,如果(M(x)lt 0)

也就是流入多于流出,那么需要额外流出(M)

同理建立超级汇,连边((x,T)),容量为(-M),补足流出不足的(M)

现在已经可以满足流量平衡了,在当前图上跑最大流。

因为上面的所有(M)都是已知量,也就是如果可行流存在的话,

所有的流出源和流入汇的所有边必须满流,否则无法补足上述流量下界要求的东西。

所以这里就可以解决无源汇可行流的问题。

有源汇 上下界可行流

依然是可行流问题,上面已经解决了无源汇的可行流问题,考虑能否将当前的有源汇转化为无源汇。

显然有源汇的的可行流中,除了源汇之外的所有点都满足流量平衡。

而流出源的容量等于流入汇的流量,所以连边汇到源,容量为(inf),这样所有点都可以满足流量平衡。

同时没有了源汇,转换为了无源汇上下界可行流问题。

有源汇 上下界最大流

由可行流变为了最大流问题。

首先明确一点,最大流一定是可行流,所以一定要先判断是否存在可行流。

跑完可行流之后可能有一些边还可以接着流,既然已经存在可行流了。

删除超级源超级汇,以及(T->S)的边,再在残余网络上解决最大流即可。

(超级源汇没有必要删去,因为不会答案产生影响)

那么答案就是残余网络上的最大流加上可行流。

注意一下可行流是什么东西,是(T->S)这条边流过的流量。

不要和超级源超级汇之间的流量搞混了。

我写的板子

有源汇 上下界最小流

最小流问题,在没有上下界限制的时候是没有意义的。(因为你可以所有边都不动啊)

首先还是判断可行流是否存在。

和上面一样删除掉超级源汇以及(T->S)的边,继续在残余网络上考虑。

其实只需要尽可能退流就好了,也就是求(T->S)的最大流,然后用可行流-最大流即可。

我写的板子

Last

这套理论从这里学的,这个博主好强啊orzorz

原文地址:https://www.cnblogs.com/cjyyb/p/9286087.html