SPFA算法是西南交通大学段凡丁于1994年发表的。
约定有向加权图G={V,E}不存在负权回路,即一定有最短路径,
此算法可理解为由无权图BFS转化衍生而来
算法实现
用dist[i]表示i点距起点的最短路径。
邻接矩阵:a[i,j]表示从第i个点到第j个点的路径即边权。
邻接表:b[i,j]表示从第i个点通过第j条边,能到达的相邻节点。
b[i,0]表示第i个点通过第j条边,能到达的相邻节点。
visit[i]表示该点是否存在于队列中
核心代码
dist[start]=0;visit[start]=1;q.push(start);//初始化
while (!q.empty())//判断队列是否为空
{
for (i=1;i<=b[q.front()][0];i++)//枚举队头到达所有相邻节点的边数
if (dist[b[q.front()][i]]>dist[q.front()]+a[q.front()][b[q.front()][i]])//判断能否更新最大权值
{
dist[b[q.front()][i]]=dist[q.front()]+a[q.front()][b[q.front()][i]];//更新权值
if (!visit[b[q.front()][i]])//判断是否已入队
{
q.push(b[q.front()][i]);//入队
visit[b[q.front()][i]]=1;//标记为已入队
}
}
visit[q.front()]=0;//标记为已出队
q.pop();//弹出队头
}