我实现了最高标签推送重新标记算法的第一阶段以获得最大流量,但我找不到任何有关如何实现第二阶段的资源,即将预流推网络转换为有效的流网络。
答案 0 :(得分:3)
如果你真的需要最大流量(可以直接从预流程导出最小切割并使用它来验证预流量),那么我知道两种方法。
关于push relabel算法的原始Goldberg - Tarjan论文中介绍了第一种方法。从本质上讲,第二阶段几乎与第一阶段完全相同。唯一的区别是源保持在距离n(而不是接收器,距离0)。这具有将过量行为路由回源的效果。
我不确定第二种方法的描述在哪里。我知道这是在Goldberg的实现中,Boost Graph implementation所基于的(见convert_preflow_to_flow
)。从概念上讲,有三个步骤。
在预流量为非循环之前,通过在反向循环中发送足够的流量来取消流量循环,以从流程图中删除其中一个弧。
在拓扑上将流程图的节点从最下层排序到源最近。
对于拓扑顺序中的每个节点,通过减少传入弧上的流量来消除其过量(这会导致尚未处理的节点过多的相应增加)。
实际上,步骤1和2都涉及深度优先搜索。天真地,人们会在检测到并取消每个周期后重新开始深度优先搜索循环检测,但是可以将深度优先搜索倒回到它首次使用消除取消的弧的点,节省时间到再次到达搜索中的那一点。拓扑顺序可以作为搜索的副产品获得,为第2步保存单独的遍历。