有上下界网络流
有上下界的网络流即是在普通的网络流的基础上,额外添加每条边流量的限制。
普通的网络流可以认为是特殊情况的上下界网络流,即流量限制为(f_iin [0,maxflow])
而现在,我们要求的每条边的容量限制为(f_iin [B_i,C_i])
这类问题我们大致可以分成三类。
无源汇 上下界可行流
因为没有源点和汇点,所以所有点都要满足流量平衡。
如果我们能够不考虑下界的话,就直接可以照搬最大流。
因为下界是一定要流满的,所以我们先强制所有边流满下界,只考虑剩下的流量(g_i)。
那么,也就是对于每一个点(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