数据结构——最短路径算法
在带权图中,“最短路径”指的是从一个顶点到另一个顶点的路径中,边的权值之和最小的路径。根据需求不同,最短路径问题可分为“单源最短路径”(从一个固定源点到其他所有顶点的最短路径)和“各顶点间最短路径”(任意两个顶点间的最短路径),对应的经典算法分别是Dijkstra算法和Floyd算法。
1. Dijkstra算法:单源最短路径
Dijkstra算法用于求解带权有向图(或无向图)中从一个固定源点到其他所有顶点的最短路径,要求图中边的权值非负(若存在负权边,算法可能失效)。其核心思想是“贪心策略”:从源点出发,逐步确定到各顶点的最短路径,每次选择“当前已知最短路径的顶点”,以此为中间点更新其他顶点的路径长度。
(1)算法思想的直观理解
可以将求解过程类比“水波扩散”:源点是起点,第一次扩散到与其直接相连的顶点,记录初始路径长度;之后每次从“已确定最短路径的顶点”出发,扩散到其邻接顶点,若通过该顶点到达邻接顶点的路径比当前已知路径更短,则更新路径长度;重复此过程,直到所有顶点的最短路径都被确定。
(2)过程分析(结合图示)
我们用一个带权有向图为例,顶点为v0,v1,v2,v3,v4v_0, v_1, v_2, v_3, v_4v0,v1,v2,v3,v4,源点为v0v_0v0,边权如图所示(用mermaid绘制如下):