码迷,mamicode.com
首页 > 编程语言 > 详细

关于增广算法中反向边引入的理解

时间:2015-11-10 23:47:16      阅读:390      评论:0      收藏:0      [点我收藏+]

标签:

首先上一张常见的图:

技术分享

考虑不引入反向边的情形:

如果执行bfs一次扫描到增广路1-2-4-6,流量总量累加10,得到的残量网络无法继续进行增广,那么算法返回最大流为10.

然而实际上最大流是20,显然该算法是有问题的。

最大流算法都是基于最大流最小割定理的,即网络流中任意可行流必然不超过任意S-T割容量,并且若流f等于某S-T割容量,

该流为最大流,该割为最小割。

这里S-T割容量指sigma(capbility(u, v)),u ∈ S,v ∈ T。

严谨的叙述及证明参考wiki。

而上述算法并没有找到等于某S-T割容量的流。

考虑任一最大流,显然该流穿过每一个S-T割,对于容量最小的S-T割,该流应该满足:

(1)所有从S到T的边上流量等于容量, (2)所有从T到S的边上的流量为零。

再以上图为例:显然S-T割(1,3,4) - (2,5,6)是一个最小割,割边(1,2), (4,6)确实被充满,而割边(2,4)上流量却不为零,所以该流不符合条件。

我们只需让割边(2,4)上流量为零即可,能做到吗?回答是肯定的。

那就是通过引入反向边和反向流量。

考虑反向割边e(y, x)上增广流量为f1,我们对其反向边的残量流量增加f1。

若该反向割边属于一个最小割的边集,设当前最大流为f,实际最大流为max_flow,

容易有f + cap(e) ≤ max_flow,由于当前割边属于最小割,

那么总可以通过s-...->x->y-...->t这条增广路径继续增广(可以证明,证略),增广的结果是反向割边e上流量为0 。

因此引入反向边及反向流量后,每当算法做出一个偏离最大流的"糟糕"决定时,总能空出一条新的增广路径弥补之。

 

关于增广算法中反向边引入的理解

标签:

原文地址:http://www.cnblogs.com/astoninfer/p/4954940.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!