我读了贝尔曼福特算法。我无法理解的是为什么有一个循环运行| V | -1次(以下段中的上部循环)。
for ( i = 1; i <= V-1; i++)
{
for (j = 0; j < E; j++)
{
int u = graph->edge[j].src;
int v = graph->edge[j].dest;
int weight = graph->edge[j].weight;
if (dist[u] != INT_MAX && dist[u] + weight < dist[v])
{
dist[v] = dist[u] + weight;
}
}
我经历了几个教程。所有人都说同样的事情可以有最大值| V | - 任何简单路径中的1条边,这就是外循环运行| v |的原因 - 1次。假设没有负权重周期,如果我们计算了最多i个边缘的最短路径,那么在所有边缘上的迭代保证给出最多(i + 1)个边缘的最短路径。
那么,当i = 1时,我在松弛法之后计算的距离是距离源最短距离的距离吗?
请解释一下......
答案 0 :(得分:2)
u
。
u
长度为dist[u]
的路径(除非dist[u]
为INT_MAX
)。i
次迭代之后,对于从源到u
且i
或更少边缘的所有路径,该路径的长度不小于{{1} }。在dist[u]
次迭代后,第二个不变量意味着从源到V-1
的简单路径不会短于u
。因此第一个意味着我们找到的路径最短。