为什么需要Bellman Ford算法中的(节点编号-1)迭代才能找到最短路径?

时间:2018-03-13 18:10:07

标签: algorithm graph shortest-path bellman-ford

enter image description here

图像:4次迭代,(a)是原始图。 (b),(c),(d),(e)对应于每次迭代后的结果。示例来自"算法简介3"

您好, 我不太了解该算法的几个方面。我希望有人可以提供帮助。以下是我的问题。

在每次迭代中,就我而言,所有边缘都是放松的。我期望在第一次迭代中所有节点都更新距离。那么为什么在第一次迭代(b)中,只更新节点t和y的距离,而另一个仍然无穷大?

另一个问题是,为什么需要(节点号-1)迭代,其中所有边都放松了?保证在每次迭代时实现什么,以便算法必须在(节点编号-1)时间运行,以确保只要没有负权重循环就能找到最短路径?

2 个答案:

答案 0 :(得分:2)

在第一次迭代中仅更新d[y]d[t]的原因是这两个顶点是唯一可以改善与s的距离估计的顶点。更准确地说,为了在特定迭代中更新d[v],必须有(u,v)d[u]+w(u,v)<d[v]s。也就是说,我们必须能够改进从vd[v]的距离估算,以便更新d[u]=inf。在第一次迭代中,u的值为每个顶点sv除外)。因此,如果s不是u的邻居,则s不是d[u]+w(u,v),因此inf+w(u,v)=inf的值等于d[v]。这意味着我们无法改进对s的估算。这就是为什么只有n-1的邻居在第一次迭代中被更新的原因,即使算法遍历图的所有边缘。

至于我们需要i次迭代的原因,在d[u]次迭代后实现了以下两个保证:

  1. 如果inf不是d[u],则存在从su的长度为s的路径。
  2. 如果从ui的路径最多有d[u]条边,则s最多是u的最短路径长度} i最多s个边缘。
  3. un-1的最短路径的边数不能超过i(假设没有负周期)。因此,两个保证(可以通过n-1上的归纳证明)意味着在s次迭代之后,如果有一条从u到{{的特定长度的简单路径1}},算法找到它。

答案 1 :(得分:0)

纯粹的归纳证明令人信服,但很难获得。由于缺少示例,我看到的大多数答案都不容易获得。

我认为,如果您具有一些归纳基础知识,那么proof of correctness就足够简单了。再一次,理解它的正确性并不意味着您就很容易理解为什么->因为在最短路径中最多有(N-1)个节点,所以我必须循环(N-1)次?

获得归纳后,我认为最重要的一点是,每个循环中的BF处理不能保证边的特定顺序:您可以按任何顺序处理边,但仍然可以达到正确的在N-1次循环后回答。

现在有一个非常简单的案例可以帮助您理解: enter image description here

结论:(所附示例中的部分)。另外,在最坏的情况下,当您有一条最短路径的长度为(N-1),并且每个第i个循环时,您仅在最短路径中放宽了源节点之后的第i个节点,您将需要(N-1)个循环。在我们的示例中,在情况2中,对于节点3,第一个循环仅设法放松了节点2,它是P(1,3)上源之后的第一个节点,因此您需要另一个循环来放松。