【问题标题】:Correctness of Bellman-Ford Algorithm, can we still do better?Bellman-Ford 算法的正确性,我们还能做得更好吗?
【发布时间】:2013-11-16 21:46:08
【问题描述】:

我了解到 Bellman-Ford 算法的运行时间为 O(|E|*|V|),其中 E 是边数,V 是顶点数。假设该图没有任何负加权循环。

我的第一个问题是,我们如何证明在 (|V|-1) 次迭代中(每次迭代检查 E 中的每条边),在给定特定起始节点的情况下,它会更新到每个可能节点的最短路径?有没有可能我们已经迭代了 (|V|-1) 次,但仍然没有得到到每个节点的最短路径?

假设算法的正确性,我们实际上可以做得更好吗?在我看来,并非所有边在特定图表中都具有负权重。 Bellman-Ford 算法似乎很昂贵,因为每次迭代都要经过每条边。

【问题讨论】:

    标签: algorithm graph bellman-ford proof-of-correctness


    【解决方案1】:

    从源到任何顶点的最长可能路径最多会涉及图中的所有其他顶点。换句话说 - 您不会有一条路径不止一次地通过同一个顶点,因为这必然会增加权重(这只是因为没有负循环这一事实才成立)。
    在每次迭代中,您将更新该路径中下一个顶点的最短路径权重,直到在 |V|-1 次迭代之后,您的更新必须到达该路径的末尾。之后,将不会有任何具有非紧密值的顶点,因为您的更新已经覆盖了该长度的所有最短路径。

    这种复杂性很紧凑(至少对于 BF),想想一长串连接的顶点。选择最左边的作为源 - 您的更新过程必须一次从那里到另一边一个顶点。现在您可能会争辩说您不必以这种方式检查每条边,所以让我们加入一些具有非常大权重(N > |V|*max-weight)的随机边——它们帮不了你,但是您的算法无法确定这一点,因此如果必须通过这些权重更新顶点的过程(它们仍然比初始无穷大更好)。

    【讨论】:

      猜你喜欢
      • 2015-08-27
      • 1970-01-01
      • 2019-05-18
      • 1970-01-01
      • 2013-01-24
      • 2015-05-04
      • 2020-03-23
      • 1970-01-01
      • 2015-07-25
      相关资源
      最近更新 更多