迪杰斯特拉算法(Dijkstra's Algorithm),又称为狄克斯特拉算法,是一种用于解决带权重有向图或无向图最短路径问题的算法。该算法由荷兰计算机科学家艾兹赫尔·狄克斯特拉在1956年发明,是一种广泛应用于网络路由和其他领域的算法。


迪杰斯特拉(Dijkstra

在 2001 年的一次采访中,Dijkstra 博士透露了他设计这个算法的起因和过程:

从 Rotterdam 到 Groningen 的最短路线是什么?我花了大概 20 分钟时间设计了这个寻找最短路径的算法。一天早上我正和我年轻的未婚妻在 Amsterdam 逛街,觉得有点累了,我们就坐在咖啡厅的露台上喝了一杯咖啡,我在想是否能够解决这个问题,然后,我设计出了这个最短路径算法。我说过,这是一个 20 分钟的设计。事实上,三年之后的 1959 年它才被发布,现在看来依然很不错,其原因之一是我当时设计的时候没有纸和笔,从而不得不极力避免所有可避免的复杂性。最终,令我惊讶的是,这个算法成为了我成名的基石之一。——引自文章《An interview with Edsger W. Dijkstra》.

一、 算法原理

迪杰斯特拉算法的核心思想是:假设当前已知从起点到某点的最短路径为已经确定的最短路径,然后通过不断扩展已知的最短路径来逐步得到起点到其他所有点的最短路径。

具体来说,算法如下:

初始化算法

  • 选定一个起点s,并初始化一个距离数组dist,其中dist[i]表示起点s到节点i的最短距离,初始时将所有元素设置为正无穷。
  • 记录一个集合S,代表已经求出最短路径的节点集合,初始时S只包含起点s。
  • 对于每个节点i,记录一个前驱节点prev[i],表示从起点s到节点i的最短路径上i的前一个节点,初始时将所有元素设置为-1。

循环求解

  • 从距离数组dist中找出不属于集合S且距离最近的节点