求解网络中最大流问题:
总结一下:
首先申明定义 :
B[u,v]表示(u,v)流量的下限,C[u,v]表示(u,v)流量的上限, F[u,v]表示(u,v)的流量,
g[u,v]表示F[u,v]-B[u,v] 显然 0<=g[u,v]<=C[u,v]-B[u,v]
1.无源汇的可行流 :
我们要想办法转换为有源汇的最大流问题.
考虑流量都为g[,]且容量为C[,]-B[,]的网络,貌似有点接近最后的转换方式了,
为了不忽略B[,]这一条件,我们把g[,]最后强制加上B[,].
但会发现一个致命漏洞,加上后就未必满足流量平衡了!
对于这个有两种办法解决..
一种方法是 添加附加源汇S,T
另一种方法相对简单.其实类似,本质相同.
具体的解?根据最前面提出的强制转换方式,边(u,v)的最终解中的实际流量即为g[u,v]+B[u,v]
为什么这种方法只适用于无源汇上下界可行流?
本质上是因为S,T并不满足流量平衡,而上述的方法都是考虑到每点的流量平衡而建的. 但有些时候貌似还是可以出正确解. 至于有没有什么解决方法,下次再想想吧~【标记下】
例题 ZOJ 2314 / SGU 194 Reactor Cooling
2.有源汇的上下界可行流
从汇点到源点连一条上限为INF,下限为0的边. 按照 1.无源汇的上下界可行流 一样做即可.
改成无源汇后,求的可行流是类似环的,流量即T->S边上的流量.
3.有源汇的上下界最大流
方法一 : 2.有源汇上下界可行流中,从汇点到源点的边改为连一条上限为INF,下限为x的边.
因为显然x>ans即MIN(T->S )> MAX(S->T) ,会使求新网络的无源汇可行流无解的(S,T流量怎样都不能平衡)
而x<=ans会有解.
所以满足二分性质,二分x,最大的x使得新网络有解的即是所求答案原图最大流.
方法二:从汇点T到源点S连一条上限为INF,下限为0的边,变成无源汇的网络.
4.有源汇的上下界最小流
方法一: 2.有源汇上下界可行流中,从汇点到源点的边改为连一条上限为x,下限为0的边.
与3同理,二分上限,最小的x使新网络无源汇可行流有解,即是所求答案原图最小流.
方法二:
首先明确,我们的方法是通过加边转化成对任一点都有流量平衡的无源汇的网络,进行求解.
即最终解只能是加上边后,求的无源汇可行流,即T->S这边上的流量.
然后,因为第一遍做的时候并无这条边,所以S->T的流量在第一遍做的时候都已经尽力往其他边流了. 于是加上T->S这条边后,都是些剩余的流不到其他边的流量. 从而达到尽可能减少T->S这边上的流量的效果,即减小了最终答案.
感觉上第一遍做的既然是不改成无源汇直接求的,应该是错误的?
这里不是错误的. 首先我们的解都是按照第二遍所求的而定,其次这里这样做本质是延迟对T->S这条边的增流.
参考: http://hi.baidu.com/dragon_eric123/item/82e259200ece744046996282
例题:SGU 176 Flow Construction http://acm.sgu.ru/problem.php?contest=0&problem=176
PS
CODE就不贴了. 感觉还是二分的清爽. 简单易懂,就是稍慢了点.
另外参考 周源的集训队作业
某个总结的不错的文章~
STO 网络流题目锦集 http://blog.sina.com.cn/s/blog_5e518b010100m6w8.html