求解网络最大流问题

求解网络中最大流问题:

总结一下:

首先申明定义 :

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, 设 M(u)=sigma(B[i,u])-sigma(B[u,j]) ,

                   则根据流量平衡条件有 M(u)同时等于 sigma(g[u,j])-sigma(g[i,u])

                   若M(u)<0,即sigma(g[u,j]) < sigma(g[i,u]) 进入u的流量比从u 出去的多,

                                     所以 u -> T 连容量为  -(sigma(B[i,u])-sigma(B[u,j]) ) 的边

                  同理. M(u)>0时,即 S->u 连容量为 sigma(B[i,u])-sigma(B[u,j])  的边.

                  然后再 对于任意边(i,u)/(u,j) 连一条 C[u,v]-B[u,v]的边.

                  这样 只需对新的网络求一遍最大流即可. 若出附加源点的边都满流即是存在可行流,反之不然.

                  满流的必要条件是显然的. 不满流不能保证加上B[,]后流量平衡. 前面都白费了.

另一种方法相对简单.其实类似,本质相同.

                仍添加附加源汇S,T 对于某边 (u,v) 在新网络中连边

                S->v 容量 B[u,v]   ,  u->T 容量 B[u,v]  , u->v 容量 C[u,v]-B[u,v]

                可以这样理解,边S->v : 求的时候直接从S流过来的流量值B[u,v], 与最终解中边(u,v)强制加上的从 u流过来的流量B[u,v],对v点的流量平衡条件的影响 实质等价.

               边u->T同理.

               最后,一样也是求一下新网络的最大流,判断从附加源点的边,是否都满流即可.

 

具体的解?根据最前面提出的强制转换方式,边(u,v)的最终解中的实际流量即为g[u,v]+B[u,v]

为什么这种方法只适用于源汇上下界可行流?

本质上是因为S,T并不满足流量平衡,而上述的方法都是考虑到每点的流量平衡而建的. 但有些时候貌似还是可以出正确解. 至于有没有什么解决方法,下次再想想吧~【标记下】

例题 ZOJ 2314 / SGU 194 Reactor Cooling http://acm.sgu.ru/problem.php?contest=0&problem=194 

2.有源汇的上下界可行流

从汇点到源点连一条上限为INF,下限为0的边. 按照 1.无源汇的上下界可行流 一样做即可.

改成无源汇后,求的可行流是类似环的,流量即T->S边上的流量.  这样做显然使S,T也变得流量平衡了.

3.有源汇的上下界最大流

方法一 : 2.有源汇上下界可行流中,从汇点到源点的边改为连一条上限为INF,下限为x的边.

因为显然x>ans即MIN(T->S )> MAX(S->T) ,会使求新网络的无源汇可行流无解的(S,T流量怎样都不能平衡)

而x<=ans会有解.

所以满足二分性质,二分x,最大的x使得新网络有解的即是所求答案原图最大流.

方法二:从汇点T到源点S连一条上限为INF,下限为0的边,变成无源汇的网络.  照求无源汇可行流的方法(如1),建附加源点S'与汇点T',求一遍S'->T‘的最大流. 再把从汇点T到源点S的这条边拆掉 . 求一次从S 到T 的最大流即可. (关于S',T'的边好像可以不拆?)(这样一定满足流量平衡?)表示这方法我也没有怎么理解.

4.有源汇的上下界最小流

方法一: 2.有源汇上下界可行流中,从汇点到源点的边改为连一条上限为x,下限为0的边.

与3同理,二分上限,最小的x使新网络无源汇可行流有解,即是所求答案原图最小流.

方法二:  照求无源汇可行流的方法(如1),建附加源点S'与汇点T',求一遍S'->T‘的最大流. 但是注意这一遍不加汇点到源点的这条边,即不使之改为无源汇的网络去求解. 求完后,再加上那条汇点到源点上限INF的边. 因为这条边下限为0,所以S',T'无影响. 再直接求一遍S'->T'的最大流. 若S’出去的边全满流,T->S边上的流量即为答案原图最小流,否则若不全满流即无解. 

 和求3.有源汇的上下界最大流过程相反,感性理解是:  

首先明确,我们的方法是通过加边转化成对任一点都有流量平衡的无源汇的网络,进行求解.

即最终解只能是加上边后,求的无源汇可行流,即T->S这边上的流量.  不改成无源汇的直接求的解是未必正确的,在(1)中已经提到.

然后,因为第一遍做的时候并无这条边,所以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就不贴了. 感觉还是二分的清爽. 简单易懂,就是稍慢了点.

另外参考 周源的集训队作业  http://wenku.baidu.com/view/0f3b691c59eef8c75fbfb35c.html

某个总结的不错的文章~  http://blog.csdn.net/pouy94/article/details/6628521

STO 网络流题目锦集 http://blog.sina.com.cn/s/blog_5e518b010100m6w8.html 决定去适当刷下.

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值