白书中写道:
“算法基于这样的一个事实:
残量网络中任何一条从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,直到无法到达汇点,算法结束,即找到了最大流,算法结束
模板题目:
解题报告:
http://blog.csdn.net/u013476556/article/details/38664795