最短路是图论中十分常见的一个问题,对于图 $G(V,E)$,从顶点 $u$ 到顶点 $v$ 的最短路径 $d(u,v)$ 为从 $u$ 到 $v$ 的任何路径中最小的边权和
最短路可分为以下两种:
- 单源最短路:图中某一顶点到其他各顶点的最短路
- 全源最短路:图中每个顶点间的最短路径
求解最短路径的算法都依赖于一条性质:两点间的最短路包含了路径上其他顶点间的最短路
对于单源最短路和全源最短路,其基本求解算法如下:
- Dijkstra 算法:求解单源最短路,$O(|E|+|V|log|V|)$
- Bellman-Ford 算法:求解单源最短路,适用于带负权值的图,$O(|V||E|)$
- SPFA 算法:求解单源最短路,Bellman-Ford 的优化算法
- Floyd 算法:求解全源最短路,利用动态规划思想,$O(|V|^3)$
- Johnson 算法:求解全源最短路,基于 Dijkstra 算法,$O(|V||E|+|V|^2log|V|)$