标签:网络流
本来心情就非常糟糕调月下毛景树把我最后一点写代码的心情调没了
放弃
开始补全网络流.
之前学了普通最大流,那么现在开始补有上下界的网络流.
在普通最大流中,网络里的每一条边都只有流量的上界即边的容量,而引入上下界网络流之后,每个边不但有一个容量,还有一个流量下界.
我们令
有这个式子可以得到
至此,我们可以将有上下界的网络流分为几种问题来对待,接下来就分别讨论一下这几种问题.
(以下内容为我阅读2004国家集训队论文《一种简易的方法求解流量有上下界的网络中网络流问题》周源 以及网上的一些文章后总结归纳写出)
假设我们现在有一个网络G,但是网络中不存在源点和汇点S,T,但我们要求网络中的任意一个点i要满足流量平衡条件:
也就是说让我们在给定有上下界的流网络中寻找可行流.
我们令
我们将每条边的容量
既然我们有
∴
∴
我们设
即为
①若
则
加入虚拟源点
②若
则
加入虚拟汇点
在我们重新构图的网络中,如果所有
因此若要在原网络中寻找一个可行流,我们只需要在修改后的网络中寻找最大流,若最大流能够使得从源点流出的弧满流,那么原图中一定存在可行流,反之不存在.
对于这种情况,我们在源点和汇点之间单独连一条边,要求新连的边不存在下界和上界(即下界为0上界为MAXINT).这样原图变成了如同问题1一样的无源汇有上下界的可行流问题.修改图之后,我们所求的流即为从汇点流向源点的流.
我们假设原图中存在源点
我们二分
我们在原图的汇点
由于第一次最大流中求得的
与Problem3相似做法二分
也是与Problem3类似,增加虚拟源点汇点,在不添加边的情况下做
结合两个人博客的理解来阐述一下上面的法2:
和求3.有源汇的上下界最大流过程相反,感性理解是:
首先明确,我们的方法是通过加边转化成对任一点都有流量平衡的无源汇的网络,进行求解.
即最终解只能是加上边后,求的无源汇可行流,即T->S这边上的流量. 不改成无源汇的直接求的解是未必正确的,在(1)中已经提到.
然后,因为第一遍做的时候并无这条边,所以S->T的流量在第一遍做的时候都已经尽力往其他边流了. 于是加上T->S这条边后,都是些剩余的流不到其他边的流量. 从而达到尽可能减少T->S这边上的流量的效果,即减小了最终答案.
感觉上第一遍做的既然是不改成无源汇直接求的,应该是错误的?
这里不是错误的. 首先我们的解都是按照第二遍所求的而定,其次这里这样做本质是延迟对T->S这条边的增流.
Dmute解决方法:先不增加d->s容量为无穷的边,进行一次maxflow(),如果还没有满流,则加一条(d,s)容量为无穷的边,再进行一次maxflow(),当且仅当所有附加弧满载时,有可行解,解为flow[(d->s)^1](即d到s的后悔边权值)。
Mr.Ant
事实上对我来说,我觉得在问题三四中法2更好一些,不仅比较好实现(只需要一次次重复调用已有的maxflow()函数),而且应该比法1好调一些(毕竟有个二分我这么沙茶很容易写残啊)
以及再次感谢 2004国家集训队论文《一种简易的方法求解流量有上下界的网络中网络流问题》周源和网上的那些博客.
标签:网络流
原文地址:http://blog.csdn.net/creationaugust/article/details/44280445