我对贝尔曼 - 福特做了一点修改,以便它只做“有用”的放松。也就是说,放松意味着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)
答案 0 :(得分:0)
考虑所有边缘都具有负权重的图表。在此图中,如果顶点u具有多个包含边缘,则它将多次添加到Q.
声明| k | < | E |是incorect:如果图中有负循环,那么k是无穷大