一、 问题描述
给定一个图G,寻找图中起点V到终点U的最短路径的方法,称为最短路径算法。路径的长短由指定的权重计算方法来决定,最常见的是边的权重之和。边的权重有正负之分,指定的起点可以是单个或全部,不同的场景适用于不同的最短路径算法。接下来分场景介绍几种典型的最短路径算法。
二、 单源无权图 – 宽度优先算法(BFS)
给定有向无权图(可视为等权图)如下,寻找起点A到终点D的最短路径,即从起点A出发,经过最少的边到达终点D。此场景适用于宽度优先搜索。

BFS的主要思想为,从起点开始,先搜索儿子节点,再搜索孙子节点,这样一代一代地搜索下去,直到到达终点,从起点到终点的代数就是最短路径的长度。在上例中,从A开始,将搜索序列初始化为[(A, 0)],然后遍历A的儿子节点B和E,加入搜索序列得到[(A, 0), (B, 1), (E, 1)],继续遍历B和E的儿子节点,加入搜索序列得到[(A, 0), (B, 1), (E, 1), (C, 2), (D, 2)],此时已经到达终点D,最短路径为A->E->D,长度为2。
三、 单源正权图 – 迪杰斯特拉算法(Dijkstra、DJ)
给定有向带正权图(权重都为正数)如下,寻找起点A到终点D的最短路径,即从起点A到终点D的路径上各边的权重之和为最小。Dijkstra算法是解决此类问题的经典算法。