图论(1)、最短路径

本文介绍了图论中的最短路径问题,探讨了Dijkstra算法、Bellman-Ford算法以及SPFA算法的原理、适用范围和时间复杂度。Dijkstra适用于正权图,而Bellman-Ford能处理负权图并检测负环。SPFA是Bellman-Ford的一种优化,但在稠密图中可能退化。文章还讨论了不同存图方法的影响。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

图论是离散数学中比较重要的一个分支;而图,恰好又是计算机中最重要的数据结构。所以今天开一个图论专题。



说道图,最先想到也是最常用的,自然就是怎样求最短路径。我们常说的最短路径指的是单源最短路径。常见的解决单源最短路径问题的算法有Dijkstra算法和Bellman-Ford算法。这两种算法都是基于动态规划思想实现的,所以这两个算法都有一个核心操作,就是松弛(Relax)。但是它们适用的范围不太一样。而对于多源最短路径,则有Floyd算法实现。


迪杰斯特拉算法

朴素Dijkstra算法遍历某一结点到其他结点的最短路径,其特点类似于BFS,层层向外扩展,直到找到终点为止。这种方法实现起来十分好理解,但是由于它遍历了大量的结点,导致它的时间复杂度达到了O(V^2+E)。若源点可达,复杂度变成O(V*logV+E*logV)。在稀疏图上,由于E=V*V/logV,时间复杂度可达O(V^2)。我们可以考虑用heap去优化Dijkstra,这样能使得复杂度进一步降低,获得O(VlogV+E)。

贝尔曼-福特算法


Dijkstra算法有个局限性,就是它只能求解单源、正权的最短路径。一旦图上含负权,Dijkstra就无能为力了。原因很好理解,Dijkstra在贪心地寻找当前距源点最小距离的点时,有可能先走过次优点,再走过该负权,会使得最短距离更小。反例很好举&#x

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值