Алгоритм SPFA - это оптимизация по Беллману-Форду.В то время как в Bellman-Ford мы просто вслепую проходим каждый край для | V |раунды, в SPFA, очередь поддерживается, чтобы убедиться, что мы проверяем только те расслабленные вершины.Идея похожа на Дейкстры.Он также похож на BFS, но узел может быть помещен в очередь несколько раз.
Источник сначала добавляется в очередь.Затем, пока очередь не пуста, из очереди извлекается вершина u, и мы смотрим на всех ее соседей v. Если расстояние v изменяется, мы добавляем v в очередь (если она уже не находится в очереди).
Автор доказал, что SPFA часто быстрая (\ Theta (k | E |), где k <2). </p>
Вот псевдокод из Википедия на китайском языке , где вы также можете найти реализацию в C.
Procedure SPFA;
Begin
initialize-single-source(G,s);
initialize-queue(Q);
enqueue(Q,s);
while not empty(Q) do
begin
u:=dequeue(Q);
for each v∈adj[u] do
begin
tmp:=d[v];
relax(u,v);
if (tmp<>d[v]) and (not v in Q) then
enqueue(Q,v);
end;
end;
End;