图像:4次迭代,(a)是原始图。 (b),(c),(d),(e)对应于每次迭代后的结果。示例来自"算法简介3"
您好, 我不太了解该算法的几个方面。我希望有人可以提供帮助。以下是我的问题。
在每次迭代中,就我而言,所有边缘都是放松的。我期望在第一次迭代中所有节点都更新距离。那么为什么在第一次迭代(b)中,只更新节点t和y的距离,而另一个仍然无穷大?
另一个问题是,为什么需要(节点号-1)迭代,其中所有边都放松了?保证在每次迭代时实现什么,以便算法必须在(节点编号-1)时间运行,以确保只要没有负权重循环就能找到最短路径?
答案 0 :(得分:2)
在第一次迭代中仅更新d[y]
和d[t]
的原因是这两个顶点是唯一可以改善与s
的距离估计的顶点。更准确地说,为了在特定迭代中更新d[v]
,必须有(u,v)
边d[u]+w(u,v)<d[v]
。s
。也就是说,我们必须能够改进从v
到d[v]
的距离估算,以便更新d[u]=inf
。在第一次迭代中,u
的值为每个顶点s
(v
除外)。因此,如果s
不是u
的邻居,则s
不是d[u]+w(u,v)
,因此inf+w(u,v)=inf
的值等于d[v]
。这意味着我们无法改进对s
的估算。这就是为什么只有n-1
的邻居在第一次迭代中被更新的原因,即使算法遍历图的所有边缘。
至于我们需要i
次迭代的原因,在d[u]
次迭代后实现了以下两个保证:
inf
不是d[u]
,则存在从s
到u
的长度为s
的路径。u
到i
的路径最多有d[u]
条边,则s
最多是u
的最短路径长度} i
最多s
个边缘。从u
到n-1
的最短路径的边数不能超过i
(假设没有负周期)。因此,两个保证(可以通过n-1
上的归纳证明)意味着在s
次迭代之后,如果有一条从u
到{{的特定长度的简单路径1}},算法找到它。
答案 1 :(得分:0)
纯粹的归纳证明令人信服,但很难获得。由于缺少示例,我看到的大多数答案都不容易获得。
我认为,如果您具有一些归纳基础知识,那么proof of correctness就足够简单了。再一次,理解它的正确性并不意味着您就很容易理解为什么->因为在最短路径中最多有(N-1)个节点,所以我必须循环(N-1)次?
获得归纳后,我认为最重要的一点是,每个循环中的BF处理不能保证边的特定顺序:您可以按任何顺序处理边,但仍然可以达到正确的在N-1次循环后回答。。
结论:(所附示例中的部分)。另外,在最坏的情况下,当您有一条最短路径的长度为(N-1),并且每个第i个循环时,您仅在最短路径中放宽了源节点之后的第i个节点,您将需要(N-1)个循环。在我们的示例中,在情况2中,对于节点3,第一个循环仅设法放松了节点2,它是P(1,3)上源之后的第一个节点,因此您需要另一个循环来放松。