迪杰斯特拉(Dijkstra)算法是一个按路径长度递增的次序产生最短路径的算法,要求所有边的权重都为非负值。
算法思路
下图为一无向网图:
如果以A为源点,求A至各顶点的最短路径。
(1)先将A到各点的最短距离赋值为A与各点的边权值,A到A的最短路径为0,我们将已找到最短路径的顶点集合称为集合M,未找到最短路径的顶点集合称为集合N。如图(1)所示。
(2)寻找离A点最近的顶点,显然是C顶点,此时A->C的最短路径长度必定是4,将C顶点纳入集合M中。
以C顶点为中心,其相邻的集合N中的顶点B、D、E
,它们经过C顶点到A顶点的距离分别为7、13、6
,将这个路径的距离与各点原本的距离比较,如果经过C顶点的路径距离更短,那么修改最短路径长度。如图(2)所示。
(3)寻找A到集合N中距离最短的顶点,显然是E顶点,将其纳入到集合M中。
以E顶点为中心,其相邻的集合N中的顶点D
,到E的距离5
,因为经过E到A的路径 6 + 5 = 11 6+5 = 11 6+5=11小于原本的最小路径距离13
,所以修改其最短路径,如图(3)所示。
(4)寻找A到集合N中距离最短的顶点,显然是B顶点,将其纳入到集合M中。
以B顶点为中心,其相邻的集合N中的顶点D
,到B的距离1
,因为经过E到A的路径 7 + 1 = 8 7+1 = 8 7+1=8小于原本的最小路径11
,所以修改其最短路径,如图(4)所示。
(5)寻找A到集合N中距离最短的顶点,显然是D
顶点,将其纳入到集合M中,此时图的全部顶点均已找到最短路径。如图(5)所示。
算法程序
程序比较简单,主要分为以下几部分:
(1)final[MAXVEX]
用于表示各顶点是否已经找到最短路径了,14-22行是参数的初始化。
(2)26-34行是寻找源点A到集合N中距离最短的顶点,即下一个路径最短的顶点。
(3)38-46行是修正集合N中各顶点的最短路径,经过已找到最短路径的顶点到源点,也许会更短。
两个嵌套for
循环可以得到此算法的时间复杂度为 O ( n 2