网络流之EK 算法

白书中写道:

“算法基于这样的一个事实:

残量网络中任何一条从s到t的有向道路都对应一条原图中的增广路——只要求出该道路中所有残量的最小值d,
把对应的所有边上的流量增加d即可,这个过程称为增广。不难验证,如果增广前的流量满足3个条件,增广后仍然满足。
只要在残量网络中存在增广路,流量就可以增大;如果残量网络中不存在增广路,则当前流就是最大流。”


3个条件: 1.容量限制(别超过容量) 2.斜对称性(添加时,减少正向,增加反向) 3.流量平衡(入等于出)


网络流EK算法
数据结构:队列
主要操作:广搜 记录路径 更新
能解决的问题:最大流(最小割)
复杂度:O(MV)v指最大容量,M指边数。
新名词:
    1.增广路:从源点s到汇点n的一条简单路,如果路上的每条边(u,v)的可改进量均大于0,则称这条路为一条增广路。
    增广路定理:网络达到最大流量当且仅当不存在增广路。
    增广路算法:从一个可行流开始不断的寻找可增广路,然后沿着它增广,直到它不存在。
    2.反向弧:如果有一条弧(u,v),那么再进行网络流算法时,要对它建立反向弧(v,u),反向弧的容量为0,与正向弧相反,正向弧减少容量时,反向弧增加容量。
建立反向弧能更多的增广,使网络流算法正确。为的是给程序一个“后悔”的机会,BFS寻找增广路的时候更加准确。
    3.可行弧:在EK算法中指可从u到v增加流量(也就是容量不为0)。
    4.可行路:从源点s到n的有可行弧构成的路径叫做可行路。    



具体操作:
    1.建立网络(正向弧+反向弧)
    2.从源点出发,广搜一条最短可行路(即最先到达汇点tink的那条路),每次到达一个点用pre数组记录是由那条边过来的(为后面减小流量做准备)
    3.到达汇点tink时,按照pre数组记录的,从可行路中找一条容量最小的进行容量减少。即找到了一条割边。

    4.重复操作2.3,直到无法到达汇点,算法结束,即找到了最大流,算法结束


模板题目:

HDU3549   


解题报告:


http://blog.csdn.net/u013476556/article/details/38664795






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值