单源最短路-SPFA算法

来源:互联网 发布:c语言在线运行 编辑:程序博客网 时间:2024/06/01 09:14

关于单源最短路-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开始
原图//就当有向图好了呵呵

此时队列: 1

第一步-由1到2松弛为5
这里写图片描述
此时队列: 1 2

第二步-由1到3松弛为4
这里写图片描述
此时队列: 1 2 3

第三步-弹出1
这里写图片描述
此时队列: 2 3

第四步-从2到4松弛为11
这里写图片描述
此时队列: 2 3 4

第五步-从2到5松弛为8
这里写图片描述
此时队列: 2 3 4 5

第六步-弹出2
这里写图片描述
此时队列: 3 4 5

第七步-由3到5不松弛
这里写图片描述
此时队列: 3 4 5

第八步-弹出3
这里写图片描述
此时队列: 4 5

第九步-4到6松弛为12
这里写图片描述
此时队列: 4 5 6

第十步-弹出4
这里写图片描述
此时队列: 5 6

第十一步-5到6不松弛并弹出5
这里写图片描述
此时队列:6

第十二步-弹出6
这里写图片描述
此时队列: 为空,遍历结束

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

0 0
原创粉丝点击