有上下界网络流问题

有上下界网络流

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

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

而现在,我们要求的每条边的容量限制为\(f_i\in [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

posted @ 2018-07-09 21:27  小蒟蒻yyb  阅读(758)  评论(6编辑  收藏  举报