2014-12-13 46 views
3

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

回答

3

做maxflow后,你知道每个边缘流动的内容的数量。

所以,当边的成本变化,你可以做以下的事情:

  1. 假设,内容流由边缘w
  2. 现在做一个forward dfs和一个backward dfs从边缘和撤消总共w内容从它连接的边缘。

enter image description here

在此,每个边缘由x/y,其中y意味着边缘容量和x表示意味着它流动的内容。

现在您想将边缘4->3的成本从2更改为3

所有你需要做的就是做从4->3边缘forward and backward dfs和撤消2重量从这些边缘为4->3流入w=2内容。

下面是该过程将是这样的:

enter image description here

现在你几乎完成:)

  • 更改边缘4->32成本到3并再次尝试找到扩充路径:)
  • 让我知道如果你发现它是二fficult理解或者如果我错了不知何故:)

    编辑:

    1. 如果新的边缘成本大于目前的成本比你将不必撤销的重量。你可以尝试找到一个改变边缘容量的增强路径。

    2. 但如果容量减少,你要撤消的重量,并设法找到可增广路。

    3. 如果一个新的边缘添加,你可以添加边缘,并尝试如有发现可增广路。而已。

    +0

    非常感谢。我还有两个问题。首先,为什么我们需要撤回重量2呢?为什么我们不能只是改变容量,并检查扩充路径?我认为如果它是最小切割的边缘之一,那么我们可能能够通过它发送更多的流动,否则不可能发送更多的流动,因为最小切割限制流动!第二,你的回答提到能力的变化。如果我添加一个新的边缘怎么办?例如添加容量4的边缘*** 4-> 6 ***? – Nima 2014-12-13 20:02:39

    +0

    不错的问题。 好吧,考虑一下新边缘成本大于当前成本的情况,在我们的示例中边缘4→3从2变为3.在这种情况下,您不必撤消重量。你可以尝试找到一条增加路径,将边缘的容量改为3. 但是如果容量减少会怎样?那就是4-> 3的容量减少到0.那么我认为以前的技术将无法工作,所以你必须撤销重量并尝试找到一条增强路径。 对于第二个问题,您可以添加边,并尝试找到扩充路径(如果可用)。而已。因为在这里你得到一条新路。 – 2014-12-14 05:31:16

    +0

    好的,我明白了。还有一个问题!当从源到边缘有多条路径改变时,或者从改变边缘的末端节点到接收器有多条路径。我们如何决定撤销哪条路径?例如,这里是从3到7的多条路径。因此有不同的方法来撤销流程。我应该如何选择要撤消的路径? – Nima 2014-12-14 21:23:11

    0

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

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

    +0

    实际上,我使用的是Edmond-Karp算法,它是福特 - 福克森的变体。唯一的区别是,在寻找增强路径的每个步骤中,它使用BFS,因此它将具有最小数量的边缘。它可以证明,在整数容量下,我们可以在多项式时间内完成工作! – Nima 2014-12-13 19:54:33

    +0

    好的。这应该做得更好。 – 2014-12-13 19:56:39