【数据结构】图—迪杰斯特拉(Dijkstra)算法

本文详细介绍了迪杰斯特拉(Dijkstra)算法,这是一个用于寻找非负权重图中从源点到所有顶点最短路径的算法。算法通过逐步更新最短路径并选择最近顶点的方式进行,最终构建出最短路径树。文中还包含算法思路、程序实现及正确性的证明。
摘要由CSDN通过智能技术生成


迪杰斯特拉(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)所示。

最短路径1

(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)所示。

最短路径2

(5)寻找A到集合N中距离最短的顶点,显然是D顶点,将其纳入到集合M中,此时图的全部顶点均已找到最短路径。如图(5)所示。



算法程序

程序比较简单,主要分为以下几部分:

(1)final[MAXVEX]用于表示各顶点是否已经找到最短路径了,14-22行是参数的初始化。

(2)26-34行是寻找源点A到集合N中距离最短的顶点,即下一个路径最短的顶点。

(3)38-46行是修正集合N中各顶点的最短路径,经过已找到最短路径的顶点到源点,也许会更短。

两个嵌套for循环可以得到此算法的时间复杂度为 O ( n 2

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值