SPFA(Shortest Path Faster Algorithm)是Bellman-Ford算法的一种队列实现,减少了不必要的冗余计算。
算法大致流程是用一个队列来进行维护。 初始时将源加入队列。 每次从队列中取出一个元素,并对所有与他相邻的点进行松弛,若某个相邻的点松弛成功,则将其入队。 直到队列为空时算法结束。
Code
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(v);
end;
end;
End;
Code
procedure spfa;
begin
fillchar(q,sizeof(q),0); h:=0; t:=0;//队列
fillchar(v,sizeof(v),false);//v[i]判断i是否在队列中
for i:=1 to n do dist[i]:=maxint;//初始化最小值
inc(t); q[t]:=1; v[1]:=true;
dist[1]:=0;//这里把1作为源点
while not(h=t) do
begin
h:=(h+1)mod n;x:=q[h]; v[x]:=false;
for i:=1 to n do
if (cost[x,i]>0)and(dist[x]+cost[x,i]<dist[i]) then
begin
dist[i]:=dist[x]+cost[x,i];
if not(v[i]) then
begin
t:=(t+1)mod n; q[t]:=i;v[i]:=true;
end;
end;
end;
end;