返回

最短路径:单源与双源算法详解

闲谈

引言

最短路径问题是计算机科学中一个经典问题,它要求找到从源点到目标点或一组点之间的最短路径。在解决该问题时,我们通常将其分为两种情况:单源最短路径和两点间最短路径。本文将分别介绍这两种最短路径问题的解决算法:Dijkstra算法和Floyd算法。

单源最短路径

单源最短路径问题是指找到从一个源点到图中所有其他点的最短路径。解决该问题最常用的算法是Dijkstra算法。

Dijkstra算法

Dijkstra算法是一种贪心算法,它通过逐步更新各个顶点的距离来找到最短路径。其具体步骤如下:

  1. 初始化:将源点标记为已访问,并将其距离设置为0,将其他所有点标记为未访问并设置其距离为无穷大。
  2. 找出当前未访问点中距离最小的点,将其标记为已访问。
  3. 更新该点相邻所有未访问点的距离:如果通过当前点到相邻点的路径比之前已知的距离更短,则更新相邻点的距离。
  4. 重复步骤2和3,直到所有点都被访问。

两点间最短路径

两点间最短路径问题是指找到从图中的一个点到另一个点的最短路径。解决该问题最常用的算法是Floyd算法。

Floyd算法

Floyd算法是一种动态规划算法,它通过逐步更新任意两点之间的最短路径来解决两点间最短路径问题。其具体步骤如下:

  1. 初始化:对图中的每个顶点i和j,如果存在从i到j的边,则将距离d[i][j]设置为边的权重;否则将d[i][j]设置为无穷大。
  2. 更新:对于每个中间点k,更新d[i][j]为min(d[i][j], d[i][k] + d[k][j]),其中i、j和k是图中的任意三个点。
  3. 重复步骤2,直到d[i][j]不再发生变化。

实例

考虑一个带有以下边的加权无向图:

A ——(5)—— B
|           \
(10)           (3)
|            /
C ——(2)—— D

Dijkstra算法:

  • 源点为A,则A到各个点的最短路径为:
    • A -> B:5
    • A -> C:7
    • A -> D:9

Floyd算法:

  • 所有点之间的最短路径为:
    • d[A][B] = 5
    • d[A][C] = 7
    • d[A][D] = 9
    • d[B][A] = 5
    • d[B][C] = 10
    • d[B][D] = 3
    • d[C][A] = 7
    • d[C][B] = 10
    • d[C][D] = 2
    • d[D][A] = 9
    • d[D][B] = 3
    • d[D][C] = 2

结论

Dijkstra算法适用于单源最短路径问题,它可以高效地找到从一个点到图中所有其他点的最短路径。Floyd算法适用于两点间最短路径问题,它可以有效地找到图中任意两点之间的最短路径。这两种算法是解决最短路径问题的关键技术,广泛应用于各种实际场景中,如导航、物流和网络优化等。