Dijkstra算法和SPFA算法的区别

Dijkstra算法和SPFA算法都可以用于求单源最短路,前者可以用小根堆进行优化,后者用就是用队列优化过的Bell-man Ford,下面说一说这两者的区别:
Dijkstra算法是基于贪心和DP的思路,一开始先将所有点到原点的距离设置为无穷大,特别的是dis[s]=0,此处的s为原点,它是每次找到离原点最近的点,放入堆中(成为堆顶)并且标记,再以这个点为起点去更新与它相连的点,类似于bfs,而bfs具有短视的特点,它只能看到与它直接相连的点,这也就决定了Dijkstra算法不能处理负权图,假设第一次找到了离原点最近的点为X,再以X为起点去更新与X相连的点,如果存在负边的话,那我找的与X相连的点到X的距离也就不一定是最小了,这就破坏了贪心的思路,算法也就出问题了
下面这张图,看了可能会更加清晰明了一些
在这里插入图片描述

SPFA算法:它是要对所有的边去进行一次松弛操作,进行了n-1次更新,先初始化dis数组,起点赋值为0,其余赋值为无穷大,先起点入队列,入了队列的被标记,当队列不为空时循环,队首元素出队,松弛与队首元素相连的边,这些被更新的点如果不在队列中就加入队列, 再次队首元素出队,松弛与队首元素相连的边,它是不需要去找离原点最近的点的,所以Dijkstra算法用的是小根堆优化,SPFA直接用的队列
SPFA还有一个很大的好处是可以处理负权图,是如何处理负权图的呢
再看下面一张图
在这里插入图片描述

  • 31
    点赞
  • 39
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值