网络流之EK 算法

来源:互联网 发布:js appendchild 编辑:程序博客网 时间:2024/04/29 04:02

白书中写道:

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

残量网络中任何一条从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






0 0
原创粉丝点击