SPFA算法
SPFA算法是西南交通大学段凡丁于1994年发表的。求单源最短路的SPFA算法的全称是:Shortest Path Faster Algorithm。从名字我们就可以看出,这种算法在效率上一定有过人之处。
很多时候,给定的图存在负权边,这时类似Dijkstra等算法便没有了用武之地,而Bellman-Ford算法的复杂度又过高,SPFA算法便派上用场了。有人称spfa算法是最短路的万能算法。本文中,我们规定有向加权图G不存在负权回路,即最短路径一定存在。
SPFA的算法(动态规划思想)
变量:我们用数组dis 记录每个结点的最短路径值(在目前步骤时),可以用邻接矩阵或邻接表来存储图G。设立一个先进先出的队列q(C++的建议使用STL)用来保存待处理的结点,将源点放入。每次处理队列首元素u点,并且用u点当前的u点最短路径值对离开u点所指向的结点v进行松弛操作(即从原点到u点然后到v点的路径,判定是否dis[j]>dis[i]+map[i][j],如果该式成立则将dis[j]减小到dis[i]+w[i][j],否则不动),如果v点的最短路径值有所调整,且v点不在当前的队列中,就将v点放入队尾。这样不断从队列中取出结点来进行松弛操作,直至队列空为止。
下面举一个实例来说明SPFA算法是怎样进行的(还是dijkstra算法的例子):
各点之间的距离如表所示。
map | i=1 | 2 | 3 | 4 | 5 | 6 |
j=1 | 0 | 120 | INF | 50 | INF | INF |
2 | 120 | 0 | 10 | INF | INF | 30 |
3 | INF | 10 | 0 | 30 | INF | INF |
4 | 50 | INF | 30 | 0 |