Bellman Ford算法解释

时间:2015-03-04 15:12:17

标签: algorithm graph-algorithm bellman-ford

我读了贝尔曼福特算法。我无法理解的是为什么有一个循环运行| 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时,我在松弛法之后计算的距离是距离源最短距离的距离吗?

请解释一下......

1 个答案:

答案 0 :(得分:2)

贝尔曼 - 福特有两个相关的不变量,适用于所有顶点u

  1. 从源到u长度为dist[u]的路径(除非dist[u]INT_MAX)。
  2. 在外部循环的i次迭代之后,对于从源到ui或更少边缘的所有路径,该路径的长度不小于{{1} }。
  3. dist[u]次迭代后,第二个不变量意味着从源到V-1的简单路径不会短于u。因此第一个意味着我们找到的路径最短。