Theme NexT works best with JavaScript enabled
0%

最短路算法

^ _ ^

最短路问题

最短路问题(short-path problem)是网络理论解决的典型问题之一。基本内容是:若网络中的每条边都有一个数值(长度、成本、时间等),则找出两节点(通常是源节点和阱节点)之间总权和最小的路径就是最短路问题。

最短路问题可分为单源最短路全局最短路两点最短路径三种。单源最短路指确定起点或终点的最短路径求解;全局最短路求解图中所有点之间的最短路径;两点最短路径指确定起点和终点,求两节点之间的最短路径。

最短路问题中比较常用的算法有:

  1. Dijkstra算法:时间复杂度为$O(V^2)$,可用堆进行优化,优化后时间复杂度可降为$O(E + VlogV)$,其中$E$为边数,$V$为结点数。该算法适用于求解单源最短路问题。但它只能适用于无负权边的图。
  2. Bellman-Ford算法:时间复杂度为$O(VE)$。
  3. SPFA算法Bellman-Ford算法浪费了许多时间做无必要的松弛,可用SPFA算法进行优化。SPFA算法基于队列进行优化,优化后时间复杂度为$O(kE)$,其中$k$为所有顶点进队的平均次数,可以证明$k$一般小于等于2,由此可见该优化的效果十分显著。
  4. Floyd-Warshall算法:适用于求解全局最短路问题,时间复杂度为$V^3$。该算法可以计算包含负权边的图,但不可含有负环。
  5. 搜索算法:常用的广度优先搜索(BFS)深度优先搜索(DFS)可用于解决两点最短路径问题,时间复杂度为$O(V)$。

图结构

图算法中的基本表示方法包括邻接表邻接矩阵两种。这两种表示法既可用于有向图,也可用于无向图。

对于稀疏图(图中边数远小于点个数),用邻接表表示能更多的节省空间;而对于需要判断两个顶点之间边的情况,用邻接矩阵表示能有更快的访问速度。

Dijkstra算法