Алгоритм Беллмана-Форда

Алгоритм Беллмана-Форда решает задачу о кратчайших путях из одной вершины для случая, когда весам ребер разрешено быть отрицательными.

Алгоритм возвращает значение TRUE, если в графе нет цикла отрицательного веса, достижимого из исходной вершины, и FALSE, если таковой цикл имеется.

В первом случае алгоритм находит кратчайшие пути и их веса; во втором случае кратчайших путей для некоторых вершин не существует

Алгоритм производит релаксацию ребер, пока все значения d[v] не сравняются с d( s,v).

BELLMAN-FORD (G, w, s)

1 INITIALIZE-SINGLE-SOURCE (G,s)

2 for i ¬ 1 to ôV[G]ô-1

3 do for (для) каждого ребра (u,v) Î E[G]

4 do RELAX (u,v,w)

5 for (для) каждого ребра (u,v) Î E[G]

6 do if d[v] > d[u] + w (u,v)

7 then return FALSE

8 returnTRUE

Оценка времени работы алгоритма

Стоимость инициализации в строке 1 есть O(V).

Общее число релаксаций есть O(VE).

Стоимость цикла в строках 5-8 есть O(E).

Суммарное время работы алгоритма есть O(VE).

Исполнение алгоритма Беллмана-Форда

Исходный граф

 

 

Последовательность просмотра ребер при релаксации

(u,v), (u,x), (u,y), (v,u), (x,v), (x,y), (y,v), (y,z), (z,u), (z,x)

Исходная вершина – z

 

Шаг 1

 

 

Шаг 2

 

Шаг 3

 

Шаг 4

 

 

Проверка достижимости циклов отрицательного веса

uv1

vv2

 

v1 v2 d[v1] d[v2] w(v1, v2) (1)+(3) (2) ? (4)
(1) (2) (3) (4)
u v >
u x <
u y -2 -4 -2 =
v u -2 =
x v -3 =
x y -2 <
y v -2 <
y z -2 =
z u <
z x =