迪克斯特拉算法
迪克斯特拉算法 Dijkstra Algorithm
Dijkstra 算法是一种用于寻找图中从单一源节点到其他所有节点的最短路径的算法(即单源最短路径算法)。它适用于所有边权重为非负值的图。这个算法最早是被荷兰计算机科学家 艾兹赫尔·戴克斯特拉 (Edsger W. Dijkstra) 发明并提出的,因此用他的名字来命名该最短路算法。
Dijkstra 算法的基本思想是逐步扩展最短路径,直到覆盖所有节点。依旧以「场景引入」章节的图来举例子,虽然我们没有办法一下子立刻求解出从 号节点到 号节点的最短路径,但是如果我们能求出从 号节点到 号节点所有的前驱节点的最短路径,那么我们就可以立刻计算出从起点到 号节点最短路。
如上图所示, 号节点有三个前驱节点,分别是节点 ,走到这三个节点的最短距离分别为两分钟、九分钟和六分钟。通过遍历这些前驱节点,我们就可以求出从起点到终点的最短路。显然,对于图中所有的节点,我们都需要按照一定的顺序依次对它们进行相同的操作。这样子,我们就可以求解出从起点开始到图中任意一个点的最短距离了。
Dijkstra 算法具体的实现流程如下:
- 初始化:
- 创建一个数组,用于记录从源点开始到任意一点的距离 。同时设定源节点的距离为 ,其他所有节点的距离为 。
- 将所有节点标记为未访问。
- 使用一个优先队列来存储节点及到某一个节点当前所计算出的最短距离。
- 选择节点:
- 从未访问的节点中选择当前距离最小的节点作为当前节点。
- PS:如没有特殊情况,一开始这个节点应该是求解最短路问题的起点(起点与自己的距离应该是 ,正如初始化步骤中所提及的)。
- 更新节点:
- 对于当前节点的每个邻居节点,计算从当前节点到该邻居节点的距离。
- 如果这个距离小于已知的到该邻居节点的距离,则更新该邻居节点的距离。