【问题标题】:Max flow along cycles沿循环的最大流量
【发布时间】:2014-11-15 07:55:11
【问题描述】:

我有一个有向图,我想找到我可以沿着循环(循环)发送的最大流量。 标准的 Ford-Fulkerson 方法可以通过增加路径(在这种情况下为循环)起作用,还是我需要一些特别的东西? 没有源/汇,我只想循环发送流。

我想要最大化的数量是 Sum(f(i,j)),其中 f(i,j) 是沿着该边缘的流量,在所有边缘上,低于常规最大值。流约束(每条边都有一个非负的有限容量,并且每个顶点的流入(v)=流出(v))。

【问题讨论】:

    标签: algorithm graph


    【解决方案1】:

    你需要做一些比扩充更复杂的事情。问题是,一旦您沿着循环发送流,您可以插入或不插入向后的剩余弧。如果你这样做了,那么没有什么能阻止你将流量发送回它的来源。如果你不这样做,那么你可以增加错误的循环。比如在图中

    c-->d
    ^   |
    |   v
    b-->e
    ^   |
    |   v
    a<--f
    

    如果所有弧都有单位容量,您可能会增加 a-&gt;b-&gt;e-&gt;f-&gt;a 并错过更长的循环 a-&gt;b-&gt;c-&gt;d-&gt;e-&gt;f-&gt;a

    相反,您要做的是运行 Bellman--Ford(或其他一些允许负长度的最短路径算法)来找到一个前向弧多于后向弧的循环并将其饱和。 (如果不存在这样的循环,那么你就有了一个最优解。)然后你会得到一个 O(OPT poly(n)) 边界,就像在 Ford--Fulkerson 中一样,其中所有弧都有整数容量,而 OPT 是最优目标值。您可以在circulation problems/network simplex 上搜索文献进行优化。

    检测前向弧多于后向的循环:将每个前向弧的长度设置为-1,将每个后向弧的长度设置为1。将每个顶点的距离标签初始化为0(模拟人为的效果没有传入弧和长度为 0 的弧到彼此顶点的源)。运行 Bellman--Ford 判断是否存在负长循环。

    【讨论】:

    • 感谢您的回答。能否请您指出一个具体的示例/解释,其中包含有关贝尔曼福特方法的更多详细信息?
    • 感谢您的回答。您能否指出一个具体的示例/解释,其中包含有关贝尔曼福特方法的更多详细信息?另外,您能否详细说明我如何在这里使用最小成本流方法?
    • @TheBaron 最小成本流程通常涉及取消成本高昂的流程周期的步骤。本质上,您想做相反的事情(创建以前不存在的正向循环)。
    • 好的,那么您是否建议我的问题可以通过将其转换为 min 来解决。成本问题,通过为边分配适当的成本?
    • 酷,在我接受之前还有一件事:这是 min.cost 还是 min.cost max。流量问题?两者有什么区别,有什么区别?
    猜你喜欢
    • 2023-01-11
    • 2016-05-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-27
    • 1970-01-01
    • 1970-01-01
    • 2017-06-07
    • 1970-01-01
    相关资源
    最近更新 更多