单源最短路-SPFA算法

关于单源最短路-SPFA算法

SPFA是Bellman-Ford的队列优化算法。用于稀疏图的效率是特别高的。时间复杂度O(ke),k<=2,神一样的效率,但是小心有些数据会卡SPFA卡到O(n^2)
该算法的主要思想是:把起始点压入队列,查找与队列头代表的结点相连的边进行松弛操作,如果相连的另一个结点不在队列内,则把那一个结点压入队列。当操作完队列头的结点后,弹出,继续操作下一个结点

Function Relax(begin,end)
if dist[end] > dist[begin] + beginend的权值 then
    dist[end] = dist[begin] + beginend的权值

Function SPFA(start)
Q.push(start) //压入起始点 Q是队列
while not Q.empty()
    foreach i in L[Q.front()] //遍历所有相连的结点 L是邻接表
        if Relax(Q.front(),i) then //如果松弛成功
            if not i in Q then //如果访问的结点不在队列里
                Q.push(i)//加入队列
    Q.pop()

从结点1开始
原图//就当有向图好了呵呵
单源最短路-SPFA算法_第1张图片
此时队列: 1

第一步-由1到2松弛为5
单源最短路-SPFA算法_第2张图片
此时队列: 1 2

第二步-由1到3松弛为4
单源最短路-SPFA算法_第3张图片
此时队列: 1 2 3

第三步-弹出1
单源最短路-SPFA算法_第4张图片
此时队列: 2 3

第四步-从2到4松弛为11
单源最短路-SPFA算法_第5张图片
此时队列: 2 3 4

第五步-从2到5松弛为8
单源最短路-SPFA算法_第6张图片
此时队列: 2 3 4 5

第六步-弹出2
单源最短路-SPFA算法_第7张图片
此时队列: 3 4 5

第七步-由3到5不松弛
单源最短路-SPFA算法_第8张图片
此时队列: 3 4 5

第八步-弹出3
单源最短路-SPFA算法_第9张图片
此时队列: 4 5

第九步-4到6松弛为12
单源最短路-SPFA算法_第10张图片
此时队列: 4 5 6

第十步-弹出4
单源最短路-SPFA算法_第11张图片
此时队列: 5 6

第十一步-5到6不松弛并弹出5
单源最短路-SPFA算法_第12张图片
此时队列:6

第十二步-弹出6
单源最短路-SPFA算法_第13张图片
此时队列: 为空,遍历结束

所以,dist就是结点1到各个结点的最短距离

你可能感兴趣的:(算法)