有上下界网络流问题

有上下界网络流

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

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

而如今,咱们要求的每条边的容量限制为\(f_i\in [B_i,C_i]\)spa

这类问题咱们大体能够分红三类。htm

无源汇 上下界可行流

由于没有源点和汇点,因此全部点都要知足流量平衡。blog

若是咱们可以不考虑下界的话,就直接能够照搬最大流。get

由于下界是必定要流满的,因此咱们先强制全部边流满下界,只考虑剩下的流量\(g_i\)ast

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

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

若是可以知足这个方程的话,每条边流量为\(B_i+g_i\)便是一组可行流。di

考虑将流量分类,由于\(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

相关文章
相关标签/搜索