Dijkstra与SPFA算法的不同之处对比

18 篇文章 0 订阅

SPFA算法
此处为SPFA算法详解

	用dis数组记录源点到有向图上任意一点距离,其中源点到自身距离为0,到其他点距离为
	INF。将源点入队,并重复以下步骤:

	1、队首x出队
	2、遍历所有以队首为起点的有向边(x,i),若dis[x]+w(x,i)<dis[i],则更新dis[i]
	3、如果点i不在队列中,则i入队
	4、若队列为空,跳出循环;否则执行1

Dijkstra算法
此处为Dijkstra算法详解

    清除所有点的标号;
    设d[0]=0,其他d[i]=INF;//INF是一个很大的值,用来替代正无穷
    循环n次 { 
        在所有未标号结点中,选出d值最小的结点x;
        给结点x标记;
        对于从x出发的所有边(x,y),更新d[y] = min{d[y], d[x]+w(x,y)} 
  • 二者最主要的区别在于:

SPFA算法可以处理带负权的边,而Dijkstra算法不行。

  • Dijkstra算法采用贪心策略,每次选择距当前最近的点进行延伸(贪心,不公平),但贪心往往只能求得局部最优解,如下图,用Dijkstra算法的话,显然1->2是当前的最短路径;
  • SPFA算法类似于bfs,属于同一层次的结点都会遍历到(公平),它求得的的最短路径是1->3->2。
    在这里插入图片描述
    在这里插入图片描述
  • 11
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值