【问题标题】:Bellman Ford Algorithm Explanation贝尔曼福特算法说明
【发布时间】:2015-03-04 15:12:16
【问题描述】:

我阅读了贝尔曼福特算法。我无法理解的是为什么会有一个运行 |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时,我用松弛法计算出来的距离,就是离源最近的距离吗?

请解释一下...

【问题讨论】:

    标签: algorithm graph-algorithm bellman-ford


    【解决方案1】:

    Bellman--Ford 有两个相关的不变量适用于所有顶点u

    1. 存在从源到u 的路径,长度为dist[u](除非dist[u]INT_MAX)。
    2. 在外循环的i 迭代之后,对于从源到u 且具有i 或更少边的所有路径,该路径的长度不小于dist[u]

    V-1 迭代之后,第二个不变量意味着从源到u 的简单路径不短于dist[u]。因此,第一个意味着我们找到的路径是最短的。

    【讨论】:

    • 在 [link] geeksforgeeks.org/… 中给出的示例中,在第一次迭代中 dist[c] 的值为 2 ,如果我们考虑到源的距离通过所有路径恰好有一条边那么 dist[c] 应该是 4。如果我错了,请纠正我。
    • @user3428090 dist[u] 最多是iu 的最短边路径的长度,但可能会更少。
    • 那么,如果 i=1,那么从 A 到 C 的最短路径是 4。对吧?
    • @user3428090 是的,从 A 到 C 最多只有一条边的最短路径的长度为 4。这不是 dist[C] 在迭代结束时 i=1 的长度。
    • 但是正如你在第2点中所说的那样,它是4。dist[C]从A经过B到C时为2,即2条边。
    猜你喜欢
    • 2021-07-30
    • 1970-01-01
    • 2018-05-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-05
    • 2021-03-17
    相关资源
    最近更新 更多