SPFA算法全名shortest path faster algorithm,最短路径更快速算法,它是与Bellman-ford算法进行比较,时间复杂度从O(n^3)或者O(nm)变成O(km),k为每个结点平均入队次数,是一个经验数,一般情况下k为2
由于Bellman-ford算法将会有大规模的冗余比较,所以我们想要尽可能的减少节点入队次数,从而降低复杂度。我们用队列实现,可以用stl自带的queue来实现,也可以用一个int数组,用head和tail指针来控制队列的操作。
算法操作:每次将队首取出来,松弛与它相连的点,如果松弛成功,判断该点是否已经在队列里了,如果在队列里了,我们就没必要入队,如果不在队列里,我们将该点入队。
void spfa(int u0)
{
memset(dist,63,sizeof(dist));
memset(inq,0,sizeof(inq));
dist[u0] = 0;
queue<int> q;
q.push(u0);
inq[u0] = 1;
while(!q.empty()){
int u = q.front();
q.pop();
inq[u] = 0;
for(int i = h[u]; i != -1; i = e[i].next){
int v = e[i].v;
if(dist[v] > dist[u] + e[i].w){
dist[v] = dist[u] + e[i].w;
if(!inq[v]){
q.push(v);
inq[v] = 1;
}
}
}
}
}
这就是SPFA算法的主体,我这里是用的邻接表存图,用邻接矩阵也可以实现,只需要修改一下相关部分的内容。