是Bellman-Ford"所有对的结果"或者"来自一个节点"最短的路径? /是否有全对Bellman-Ford版本?

时间:2017-07-16 10:14:12

标签: algorithm graph bellman-ford

我最近正在学习图形算法,在我的大学里我们被教导,Bellman-Ford的结果是一个从所有节点到所有其他节点(所有对最短路径)的距离表。但是我不明白这个算法是如何实现的,并试图通过观看YouTube视频和在维基百科中查找定义等来理解它...

现在出现问题:
我找不到描述算法的资源,其结果将是所有对最短路径表,但只有#34;从一个节点到所有其他节点"。

可以调整Bellman-Ford算法来实现所有对最短路径表,还是我的大学讲师对此完全错误? (他确实解释了一些算法,提供了所有对最短路径,他称之为Bellman-Ford,但我认为这不可能是Bellman Ford)

编辑:我完全理解Bellman-Ford算法的问题"从一个节点到所有其他节点的最短路径"。
我也理解大学教授的大部分算法,所有算法都是最短的路径" 我很困惑,因为我大学的算法也叫做#34; Bellman-Ford" 如果你说德语:这是一个视频,大学讲师谈论他的"贝尔曼 - 福特" (我认为其实不是贝尔曼 - 福特):
https://www.youtube.com/watch?v=3_zqU5GWo4w&t=715s

3 个答案:

答案 0 :(得分:4)

Bellman Ford是用于查找从给定起始节点到图中任何其他节点的最短路径的算法。

使用Bellman Ford,如果我们从每个节点运行bellman ford算法然后获得所有其他节点的最短路径,我们可以生成所有对最短路径,但是该算法的最坏情况时间复杂度将是O(V * V * E)如果我们有完整的图形,这个复杂性将是 O(V ^ 4),其中 V 是图中顶点(节点)的数量和 E 是图表中的边数。

有更好的算法可以找到在 O(V ^ 3)时间复杂度下工作的所有对最短路径。这就是Floyd Warshall算法。

您可以在此处详细了解:https://en.wikipedia.org/wiki/Floyd%E2%80%93Warshall_algorithm

答案 1 :(得分:1)

该算法的目的是找到从起点到终点的最短路径。

要做到这一点,它会找到从所有点到每个其他点的最短距离,然后选择导致解决方案的路径,并且还加起来最短。

首先,它从起点(A)开始。将每个点的成本设置为无穷大。

现在它可以看到来自A的所有可能方向。并且A的初始成本设置为零。

想象一下,它只需要前往B.其中可能有一条将B连接到A的直线路径,其成本就是10。

但是也有一条通过C的路径。从A到C它需要成本5而从C到B需要成本仅为2.这意味着从A到B有两条可能的路径。一条花费10和其他5 + 2即7。因此,它应将从A到达B的成本更新为不是10,因此应选择路径。

你可以想象同样的情况,但还有更多的观点。它应从起始点搜索到达遍历所有可能路径的终点,并在需要时更新/不更新成本。最后,它应查找所有路径并选择成本最低的路径。

  

现在出现了问题:我找不到资源   以一种结果将是全部的方式描述了算法   将最短路径表对,但仅从一个节点到另一个节点   节点"

要理解这一点,想象一下我们必须达到A到D.

下面列出了从一个点移动到另一个点的个人成本

  • A到B:15

  • A到C:10

  • B to C:3

  • B到D:5

  • C至D:15

最初将所有点设置为无穷大,除了A到零。

首先,

A-> B:成本= 15(更新B'成本为15)

A-> C:成本= 10(将​​C&C的成本更新为10)

B-> C:成本= 18(B'成本加B-> C单独成本,因此不要更新为C&C已经小于此的成本)

C-> B:成本= 13(C'成本加C-> B单独成本,将B成本更新为13,因为它小于15)

B-> D:成本= 18(B'新成本加上B-> D成本,更新D&#39成本,因为这小于无穷大)

C-> D:成本= 25(C'成本加C-> D成本,不更新D)

因此,算法选择的路径是导致D的路径,成本为18,这是最小的成本!

     B  
  /  |  \ 
A    |   D
  \  | /
     C

A-> C-> B-> D成本:18

现在,您可以阅读this链接以便更好地理解。事情应该很清楚。

答案 2 :(得分:0)

我在大学论坛上问过并得到以下答案:

贝尔曼 - 福特最初“来自一个节点”。然而,当将原始Bellman-Ford算法应用于图的每个节点时,不变量(算法引擎下的想法)不会改变。

原始Bellman-Ford的复杂性为O(V ^ 3),如果从每个Node开始,它将是O(V ^ 4)。然而,有一个技巧可以使用,因为算法期间的发现类似于输入矩阵(包含直接路径长度)与其自身的矩阵乘法。因为这是一个数学环,人们可以作弊并简单地计算矩阵^ 2,矩阵^ 4,矩阵^ 8等等(这是我不完全理解的部分)并且可以实现O(V ^ 3 * log V )。

他也称这种算法为Bellman-Ford,因为算法背后的不变/想法仍然是一样的。

German answer in our public university forum