当前位置: 首页 > 知识库问答 >
问题:

Ford-Fulkerson算法的一种改进

浦泳
2023-03-14

假设我们重新定义剩余网络,不允许边进入s。认为福特-富尔克森的程序仍然正确地计算了最大流量。

我在想,当我们增加一条路径时,反向边缘的剩余容量会增加,如果需要,可以用来减少该边缘的流量(但总体上增加网络流量)。因此,如果我们不允许边进入s,这意味着我们不允许边s-x中的流减少(xs的相邻节点)。因此,当我们允许边进入s时,我们可以有一个类似的循环

s到x_1导线到y导线到x_2到s到x_3导线到t

但是如果我们再次禁止边进入s,我们可以在没有循环的情况下找到相同的路径。上面所有的都是直观的想法,但是我想要一个正式的证明。

问题来自Cormen等人对算法的介绍。

共有1个答案

帅令雪
2023-03-14

我认为你的直觉已经足够证明了。让我们考虑两个图:在图G1中,我们允许边变成s,在图G2中我们不允许。

现在,假设Ford Fulkerson算法在G1中找到一个更大的流,那么它在G2中找到了。由于G2中的所有增广路径在G1中也是有效的,我们可以在两个图上尽可能长地使用相同的增广路径,然后获得剩余网络的状态,其中G1中有一条增广路径,但G2中没有。

然而,正如你所指出的,任何在G1中有效的增广路径在G2中也是有效的,前提是我们删除最后一次访问s之前的所有边。因此,我们的假设是错误的,这种情况不可能存在——福特·富尔克森将在G1和G2上产生相同的输出。

 类似资料:
  • 我有一些困难理解福特-富尔克森算法的最大流量,希望得到一些帮助。 您会注意到节点B和C有一个双向边沿,B-C的容量为8,C-B的容量为3。 现在假设下一条路径是a-c-b-d-f。 我的问题是,我们现在能够通过C-B推动多少流量?是11通过使用8已经推动的流量加上能力3在另一个边缘还是只有3或可能8? 谢谢你抽出时间。

  • 我试图在Java实现Ford Fulkerson算法。到目前为止,我有了一个带节点和边的图。节点包含一个ID字符串和一个边的邻接列表。边包含容量和它通向的节点。 我正在尝试理解维基百科页面上的psudo代码,以及如何实现它(我正在使用Java)。这是我目前所理解的: > 首先我将图中所有边的流设置为零。(什么是表示流的好方法?直接在我的图的边中作为变量?) 第二步是创建残差图,它是一个网络,其中边

  • 我已经实现了Ford Fulkerson算法,现在正在尝试它的一个变体。 假设解导出后,其中一条边的容量增大或减小。我们需要找到一个算法,以获得新的最大流量使用当前的解决方案,而不是从一开始。 我的建议是,在这个例子中,如果我们假设1-3个边的容量从12减少到8,那么我们需要做一个从1到开始节点的BFS,并且在每个边上减少4的流量,做一个从3到5的BFS,并且减少那里的流量。但我不确定这是否正确。

  • 我正在做一个有向图的项目,其中边的权重都依赖于变量x。我试图找到x的最小值,这样我的图就不包含任何正权重的回路。 我的问题是——这可能很愚蠢,但我不明白如何——:我如何使用改良的贝尔曼-福特来检查正电路而不是负电路的存在? 谢谢。

  • 假设有一个具有

  • 我在试图理解这个算法是如何工作的。 给定一个问题,搜索从源s到图中所有顶点的路径, 我想我必须这样做: 我的问题是: 我的程序是好的还是我必须改变它。 当我必须检查是否存在负循环时?非常感谢。