证明增广路算法的正确性

一直对增广路这种贪心思想表示怀疑,今天看到一个很好的证明~

首先介绍割的概念,所谓图的割,指的是某个顶点集合S属于V,从S出发的所有边的集合成为割(S,V\S),这些边的容量和被称为割的容量,如果有源点s属于S,汇点t属于V\S,则称之为s-t割,如果将s-t割的所有边都在原图中去掉,则不再有s->t的路径。

容易得到,对于任意一个s-t割,总有f的流量<=割的容量,根据平衡条件,当且仅当割为最小割,流为最大流时取等号。

首先,对于ford-Fulkerson算法求出的流为f,f对应的残余网络中从s可达的顶点集合为S,因为f对应的残余网络中不存在从s->t的路径了,那么显然,在残余网络中,任意一条从S->V\S 中的边流量f=c,任意一条从反向弧f=0,这个一定是满足,如果不满足,那么S集合还可以扩充顶点,与前提矛盾。因此,S->V\S的割的容量等于流的大小。则可以证明裸的増广路ford算法是正确的。

再说一下dinic算法,dinic算法总是寻找最短的増广路并沿着它增广,増广路的长度不会在增广过程中改变,则当无法增广时,说明分层图上没有可以增广的路线了,这有两种情况,第一,已经求出了最大流,第二,可能存在长一些的増广路可以继续增广,因此,继续bfs构造分层网络。每次完成后最短増广路长度+1,由于最短路<n,则最对重复n-1次bfs就可完成了。

感谢liuzhan214大大的证明过程:http://blog.csdn.net/liuzhan214/article/details/52057985

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值