2F算法包括两个步骤:标号,增流
2F算法描述:
(1)初始化f(e)=0,e∈E;//初始化
(2)给源点s标号(-,∞),其它顶点均未标号;
(3)依次选一个未标号的顶点,根据其方向进行标号,若当前标号的顶点为t,转(4),否则转入(6);(给一条路径标记)
(4)选择一条标号过的增流路径进行增流;
(5)转(2)
(6)这时得到的f就是最大容许流。
Edmonds-Karp修正算法
在每一次都沿一条最短的增流路径增流。
Edmonds-Karp算法描述:
(1)对所有e∈E,有f(e)=0;//初始化
(2)给源点s标号(-,∞),其它顶点均未标号;
(3)按层次依次对可以标号的顶点进行标号,若当前标号的顶点为t,转(4),否则转入(6);(给可以标记的全部的点标记)
(4)选一条标号过的增流路径进行增流;
(5)转(2)
(6)这时得到的f就是最大容许流。
Dinic算法的特点是:
将顶点按其与源点s的最短距离分层。
如果说,2F算法采用DFS策略;那么,EK算法就是采用了BFS策略;而,Dinic算法则兼采两者。
Dinic分层算法描述:
(1)L0={s},i=0,R=V-L0;//分层初始化
(2)S={v|v∈R,且存在从Li某顶点到v的未饱和边};
(3)若S={},则网络流已达到最大,停止;
(4)i=i+1,Li=S,R=R-Li;
(5)若t∈S,则分层停止,否则令S={},转(2);
Dinic最大流算法:
(1)对所有e∈E,f(e)=0;//初始化
(2)对图进行分层;
(3)对图中增流路径增流;
(4)去掉图中饱和边,调整c(e)和f(e)值;
(5)转(2);