【发布时间】:2017-06-05 02:44:22
【问题描述】:
我刚刚开始学习新算法,但是当我在极客的极客上阅读 bellman ford 算法时我被卡住了:- http://www.geeksforgeeks.org/dynamic-programming-set-23-bellman-ford-algorithm/
上面写着-
算法以自下而上的方式计算最短路径。它首先 计算最短路径的最短距离 至多在路径中的一个边缘。然后,它计算最短路径 最多 2 条边,以此类推。
外循环第i次迭代后,计算出最多有i条边的最短路径。可以有最大值 |V| – 任何简单路径中的 1 条边,这就是外循环运行 |v| 的原因– 1 次。这个想法是,假设没有负权重循环,如果我们计算了最多有 i 个边的最短路径,那么对所有边的迭代保证给出最多有 (i+1) 条边的最短路径。
让我们通过以下示例图了解算法。图片来源于此。
让给定的源顶点为 0。将所有距离初始化为无限,除了到源本身的距离。图中的顶点总数为 5,因此所有边必须处理 4 次。
在下面的例子中,如果边的顺序是 - (AB),(BE),(ED),(DC),(AC),(BC),(DB),(BD) 那么只有一次迭代它将计算最短路径,甚至 2-3 条边与“它首先计算 最多有一条边的最短路径的最短距离 在路径中。然后,它计算最多有 2 条边的最短路径, 等等。外循环第i次迭代后,最短路径 最多计算 i 边缘“所以在改变顺序 边缘这个陈述将被证明是错误的。
让我们通过以下示例图了解算法。图片来源于此。
让给定的源顶点为 0。将所有距离初始化为无限,除了到源本身的距离。图中的顶点总数为 5,因此所有边必须处理 4 次。
让所有边按以下顺序处理:(B,E), (D,B), (B,D), (A,B), (A,C), (D,C), (B ,C), (E,D)。第一次处理所有边缘时,我们得到以下距离。第一行显示初始距离。第二行显示处理边缘 (B,E)、(D,B)、(B,D) 和 (A,B) 时的距离。第三行显示处理 (A,C) 时的距离。第四行显示何时处理 (D,C)、(B,C) 和 (E,D)。
第一次迭代保证给出最多 1 条边长的所有最短路径。第二次处理所有边时,我们得到以下距离(最后一行显示最终值)。
第二次迭代保证给出最多 2 条边长的所有最短路径。该算法再处理所有边 2 次。第二次迭代后距离最小化,因此第三次和第四次迭代不会更新距离。
【问题讨论】:
-
虽然问题的呈现非常简洁和详细,但要理解实际问题是什么有点困难。此外,在上面的第一个黄色块中,我认为边缘
BD和DB丢失了。 -
是的,您更确切地说是在哪里卡住了? :)
-
谢谢我错过了BD和DB,现在我更正了。我的问题是我观看了 bellman ford 的几个视频,并在各个网站上进行了研究,我们可以以任何随机顺序获取边缘,但这里据说 - 在第一次迭代中,它会给出最多 1 个边缘的最短路径,依此类推。只有当边缘有一定的顺序时,这似乎才是正确的。
标签: algorithm graph dynamic-programming shortest-path bellman-ford