带负权回路的图没法求最短路。只能判断是否存在。
算法 | 特点 | 时间复杂度 | 类型 | 负边或负环的处理 |
---|---|---|---|---|
朴素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(n−1) 因此在稠密图中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 |