一个稍快的贝尔曼 - 福特

时间:2012-05-24 23:17:07

标签: graph shortest-path bellman-ford

我对贝尔曼 - 福特做了一点修改,以便它只做“有用”的放松。也就是说,放松意味着d(v)被更新。

define Relax(u, v):
 if d(v) > d(u) + w(u,v)         //w(u,v) = weight of edge u->v
    d(v) = d(u) + w(u,v)


INIT // our usual initialization.
Queue Q
Q ← s // Q holds vertices whose d(v) values have been updated recently.
While (Q not empty)
{
  u ← Frontof(Q);
  for each neighbor v of u
  {
    Relax(u, v)

    if d(v) was updated by Relax and v not in the Q  //Here's where we're a bit smarter
        ADD v to End of Q.                           //since we add to Q if 
                                                     //the relaxation changed d(v)
  }
}

现在,如果所有最短路径最多有k个弧线。然后最坏情况的运行时间是O(V * k),因为我们在这个智能版本中只经历了k个弧。由于| k |,这比原始的O(V * E)快一点< | E |

任何人都可以告诉我一种图表的类型,这个改进版本并不比原来的Bellman-Ford算法好吗?也就是说,最佳情况表现为O(V * E)

1 个答案:

答案 0 :(得分:0)

考虑所有边缘都具有负权重的图表。在此图中,如果顶点u具有多个包含边缘,则它将多次添加到Q.

声明| k | < | E |是incorect:如果图中有负循环,那么k是无穷大