关于单源最短路-SPFA算法
SPFA是Bellman-Ford的队列优化算法。用于稀疏图的效率是特别高的。时间复杂度O(ke),k<=2,神一样的效率,但是小心有些数据会卡SPFA卡到O(n^2)
该算法的主要思想是:把起始点压入队列,查找与队列头代表的结点相连的边进行松弛操作,如果相连的另一个结点不在队列内,则把那一个结点压入队列。当操作完队列头的结点后,弹出,继续操作下一个结点
Function Relax(begin,end)
if dist[end] > dist[begin] + begin到end的权值 then
dist[end] = dist[begin] + begin到end的权值
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到各个结点的最短距离