不知道为什么一直不会这个东西,可能是太懒了
无源汇上下界可行流:
我们知道最基本的网络流就是有上界的网络流,那么加了一个下界有什么不一样呢?
一个大胆的想法:
默认每条边流到了下界,然后把边的流量限制设为上限-下限,直接跑。
这显然是不对的,不然可行流不就一定存在了吗?
我们发现这样不能满足网路流的流量守恒。
如果默认每条边流到了下界,那么对于一个点来说,它就可能不满足流量守恒了。
设q[i]q[i]q[i]为i这个点入边下界之和-出边下界之和,q[i]≠0q[i]≠0q[i]̸=0显然是不行的
q[i]>0q[i]>0q[i]>0说明流出少了,我们需要分一点流。
q[i]<0q[i]<0q[i]<0说明流出多了,我们需要补一点流。
新建超级源ssssss和超级汇tttttt
若q[i]>0q[i]>0q[i]>0,ss−>i r=q[i]ss->i~~r=q[i]ss−>i r=q[i]
若q[i]<0q[i]<0q[i]<0,i−>tt r=q[i]i->tt~~r=q[i]i−>tt r=q[i]
对新图跑最大流,如果能把附加边跑满,即最大流=∑[q[i]>0]∗q[i]=\sum[q[i]>0]*q[i]=∑[q[i]>0]∗q[i],就说明至少能在流量平衡的情况下使每条边流到下界,也就是有可行流。
有源汇上下界可行流:
连t−>s r=∞t->s~~r=∞t−>s r=∞变成循环流
然后与上面的一样。
有源汇上下界最大流:
做完有源汇上下界可行流后,把t->s和ss、tt去掉,再从S开始跑最大流。
原图最大流等于两次最大流之和。
有源汇上下界最下流:
做完有源汇上下界可行流后,把t->s和ss、tt去掉,再从T开始跑最大流。
原图最小流等于第一次最大流-第二次最大流。
有源汇上下界最小(大)费用可行流:
边加入和流量和之前的是一样的。
费用的话:
ss、tt的边费用为0.
其它边的费用就是本来的费用。
从ss开始,跑最小费用最大流,
若有解,费用=所有边的下界*费用+跑的费用。