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 個の弧を持っているとします。このスマート バージョンでは k 個のアークしか通過しないため、最悪の場合の実行時間は O(V*k) です。|k| であるため、これは元の O(V*E) よりも少し高速です。< |E|
この改善されたバージョンが元の Bellman-Ford アルゴリズムより優れていないタイプのグラフを教えてください。つまり、最高のパフォーマンスは O(V*E) です。