【算法】【最短路】Dijkstra/Bellman-Ford/SPFA/Floyd 分析

带负权回路的图没法求最短路。只能判断是否存在。

算法 特点 时间复杂度 类型 负边或负环的处理
朴素Dijkstra(迪杰斯特拉) 稠密图,邻接矩阵存储 O( n 2 n^2 n2) 单源最短路 不能处理带负权边的图
堆优化Dijkstra 稀疏图,邻接表存储 O( m l o g n mlog^n mlogn) 单源最短路 不能处理带负权边的图
Bellman-Ford(贝尔曼-福特) 可以求有边数限制的最短路 O(mn) 单源最短路 图中可以有负权边,可以判断是否存在负环。
SPFA Bellman-Ford的队列优化 一般O(m),最坏O(mn) 单源最短路 图中可以有负权边,可以判断是否存在负环。
Floyd(弗洛伊德算法) 基于动态规划 O( n 3 n^3 n3) 多源最短路 图中可以有负权边,可以判断是否存在负环。

满边图 m = C n 2 = n ( n − 1 ) 2 m=C^2_n=\frac{n(n-1)}{2} m=Cn2=2n(n1) 因此在稠密图中O(m) = O( n 2 n^2 n2) 。但在稀疏图中可以将O(m)近似视为O(n)

待办:必经点路径问题疑惑
之前遇到过几次求经过所有点的最短路径问题。在网上也没找到答案,大概有两个问题。

求经过所有点的最短路径,不可重复经过/可重复经过(两点间不同方向权值不同)。
求必须经过特定点的最短路径,后面同上。

名称 具体分析、例题 应用
Dijkstra 迪杰斯特拉 https://blog.csdn.net/dreambyday/article/details/77720809
Bellman-Ford 贝尔曼福特 https://blog.csdn.net/dreambyday/article/details/80620795
Floyd 弗洛伊德
SPFA 贝尔曼福特变形 https://blog.csdn.net/dreambyday/article/details/54915985

你可能感兴趣的:(#,数据结构与算法,spfa)