例题链接
首先还是得吐槽一下题意。
题意是这样的:
求出一个流使得源点的总流出量等于汇点的总流入量,其他的点满足流量守恒,而且每条边的流量满足上界和下界限制。在这些前提下要求总流量最小。
好像是有两种做法的。
做法1:
首先先求出可行流,按照上一篇博客的做法即可。
上一篇博客
很明显现在已经满足下界了,那么我们只需在残量网络上求出最小流即可。
此时需要理解反向边。
反向边的流量增加等价于正向边的的流量减少。
那么t到s的流就相当于s到t减少的流。
那么求出t到s的最大流就相当于s到t减少最多的流,那么剩下的就是最小流。
所以最后的答案就是可行流大小-t到s的最大流
然而我并没有用第一种做法(以后可能会补代码吧)
做法2:(其实我觉得做法1更容易理解)
建立超级源和超级汇之后呢。
先跑一次最大流。
然后t到s连一条无穷大的边。
再跑一次最大流。
最后的答案就是无穷大的边流过的流量。
有点难理解。
首先因为整个图满足流量平衡。
所以说t点流入的流量等于流出的流量。
那么他流出的流量只有那一条无穷大的边而已。
所以说最小流就是求那条边(无穷边)流过的流量尽量小而已。
所以说第一次流最大流的时候已经满足下界。那么满足下界能流的边已经流满。
所以残量网络剩下的最大流就会尽可能的小了。
大概就是这样吧。
代码实现:
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<iostream>