添加边缘后更新最大流量

时间:2014-12-13 05:47:27

标签: algorithm graph max-flow ford-fulkerson edmonds-karp

考虑到我们有网络流并使用Edmond-Karp算法,我们已经拥有网络上的最大流量。现在,如果我们向网络添加任意边缘(具有一定容量),更新最大流量的最佳方法是什么?我正在考虑更新关于新边缘的剩余网络,并再次寻找扩充路径,直到我们找到新的最大流量,但我不确定它是否有效或是否是最佳方式!

2 个答案:

答案 0 :(得分:4)

执行maxflow后,您就会知道每个边缘流动的内容量。

因此,当边缘成本发生变化时,您可以执行以下操作:

  1. 假设,该边缘流动的内容为w
  2. 现在从该边缘开始forward dfsbackward dfs,并从其关联的边缘撤消总w个内容。
  3. enter image description here

    此处每条边都由x/y表示,其中y表示边缘容量,x表示其流动的内容。

    现在您要将边4->3的费用从2更改为3

    您需要做的就是从forward and backward dfs边缘4->32,并在4->3w=2内容的情况下从这些边缘撤消4->3权重。

    以下是流程:

    enter image description here

    现在你差不多完成了:)

    1. 将边缘2的费用从3更改为{{1}},然后再次尝试查找扩充路径:)
    2. 如果您发现难以理解,或者我错了,请告诉我:))

      编辑:

      1. 如果新的边缘成本高于当前成本,那么您不得不撤消重量。您可以尝试找到改变边缘容量的扩充路径。

      2. 但如果容量减少,你必须减轻重量并试图找到一条增强路径。

      3. 如果添加了新边,您只需添加边并尝试查找扩充路径(如果可用)。那就是它。

答案 1 :(得分:0)

实际上添加新边缘并不是很困难 - 在添加边缘之前,您有边缘的流量/容量,然后添加边缘及其反转。然后运行您用来查找扩充路径的算法,直到找到非零流量,就是这样。已经发现大部分最大流量,所以这应该(理论上)不要太慢。我不知道你使用的是哪种最大流算法,所以我不能更具体,但是在添加新边缘之后你可能会违反算法的属性,因此你会以次优的方式找到最大流量。您仍然已经处理了大部分图表,所以这不应该是一个太大的问题。

我建议您使用Ford-Fulkerson算法完成任务,无论您使用最大流量的原始算法是什么。我认为在大多数最大流量已经被发现的情况下它会表现良好。