3.28
今日
一、最短路径算法 详解
-
Dijkstra 算法
核心定位
单源最短路径(一个起点到所有点),无负权边
适用图
稠密图 → 朴素版(邻接矩阵)
稀疏图 → 堆优化版(邻接表)
时间复杂度
朴素版:
O( n^2 )
堆优化版:
O(Elogn)
朴素:用数组存距离,每次选最小距离的点,更新相邻点
堆优化:用优先队列(小根堆) 优化选点过程
核心特点
效率极高 正权图首选 绝对不能处理负权边 / 负环
贪心选小点,无负才能用 -
Bellman-Ford 算法
核心定位
单源最短路径,支持负权边,能判断负环
适用图
所有图(稀疏 / 稠密都能用,但效率极低)
时间复杂度
O(n×E)
实现方式
遍历所有边,重复松弛n−1次;第n次还能松弛 = 有负环
核心特点
支持负权边 能检测负环 速度最慢,几乎不用
遍历所有边,负环我能判
SPFA 算法(Bellman 队列优化)
适用图
稀疏图首选
时间复杂度
平均
O(E)
,最坏
O(nE)
实现方式
用队列存待更新的点,避免重复遍历无用边
核心特点
比 Bellman 快很多支持负权边 负环会死循环(可加计数判负环) 正权图不如 Dijkstra -
Kruskal 算法(边贪心)
核心定位
最小生成树(连通所有点,总边权最小)
适用图
稀疏图 首选!
时间复杂度
O(ElogE)
(排序边的时间)
实现方式
把所有边按权值从小到大排序
用并查集选边:不形成环就加入
选够n−1条边结束
核心特点
代码最简单(10 行搞定) 稀疏图效率无敌 稠密图 / 完全图 绝对不用(边太多,排序爆炸)
排序加并查,稀疏图称王 -
Prim 算法(点贪心)
核心定位
最小生成树
适用图
稠密图 / 完全图
时间复杂度
朴素版:
O(n^2)
堆优化版:
O(Elogn)
实现方式
用数组存点到生成树的最小距离
每次选距离最小的点加入生成树
更新其他点的距离,累加 n−1条边
核心特点
稠密图 / 完全图 效率碾压 Kruskal 不用存边,直接计算边权(完全图神器)
点选最小边,稠密图无敌

浙公网安备 33010602011771号