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