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

此时队列: 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
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值