Dijkstra's shortest path algorithm

本文介绍了Dijkstra最短路径算法的原理,通过将顶点分为已计算和未计算集合,逐步找到源顶点到所有顶点的最短路径。文章还详细讨论了堆数据结构,包括插入、删除、最小元素提取等操作,并阐述了堆在快速计算最小值、堆排序、优先队列以及Dijkstra算法加速中的应用。
摘要由CSDN通过智能技术生成

Dijkstra’s shortest path algorithm

思路:将顶点集分为两部分。集合 V1 表示已计算出到源顶点最短距离的顶点的集合,集合 V2 表示尚未计算出到源顶点最短距离的顶点的集合。

V1 初始化为源顶点S。算法每次从 V2 中选择一个顶点加入 V1 中,同时保持 V1 集合的性质: V1 中每个顶点都已知其到源顶点S的最短路径。 则经过 N1 次循环, V1 = V , V2 = 算法终止。

每一次循环是依据什么来从

Dijkstra's Shortest Path Algorithm是一种用于解决带权图单源最短路径问题的贪心算法。下面通过一个简单的例子来解释Dijkstra's算法,并画出其图表。 假设我们有如下的带权图: ``` 2 3 (A)-----(B)-----(C) | | | |5 |4 |1 | | | (D)-----(E)-----(F) 7 6 ``` 其中,每个节点的名称用大写字母表示,括号中的数字表示节点之间的边权。 现在我们要从节点A出发,求到其它所有节点的最短距离。 Dijkstra's算法的流程如下: 1. 初始化,将起点A加入节点集合S中,并将起点到所有节点的距离初始化为正无穷。 ``` dist[A] = 0 dist[B] = inf dist[C] = inf dist[D] = inf dist[E] = inf dist[F] = inf S = {A} ``` 2. 按照距离起点的距离从小到大的顺序,依次将节点加入节点集合S中,并更新其它节点的距离。 在本例中,第一个被加入节点集合S中的节点是A,因此需要更新与A相邻的节点B和D的距离。通过从A到B和D的距离,发现从起点A到节点D的距离更短,因此更新dist[D]的值为7,并将节点D加入节点集合S中。 ``` dist[A] = 0 dist[B] = 2 dist[C] = inf dist[D] = 7 dist[E] = inf dist[F] = inf S = {A, D} ``` 接下来,选择距离起点最近的节点B,并更新与其相邻的节点E的距离。通过从A到B再到E的距离,发现从起点A到节点E的距离更短,因此更新dist[E]的值为9,并将节点E加入节点集合S中。 ``` dist[A] = 0 dist[B] = 2 dist[C] = inf dist[D] = 7 dist[E] = 9 dist[F] = inf S = {A, D, E} ``` 然后,选择距离起点最近的节点D,并更新与其相邻的节点B和E的距离。通过从A到D再到B和E的距离,发现不需要更新任何节点的距离。 ``` dist[A] = 0 dist[B] = 2 dist[C] = inf dist[D] = 7 dist[E] = 9 dist[F] = inf S = {A, D, E, B} ``` 接下来,选择距离起点最近的节点C,并更新与其相邻的节点B的距离。通过从A到B再到C的距离,发现从起点A到节点C的距离更短,因此更新dist[C]的值为5,并将节点C加入节点集合S中。 ``` dist[A] = 0 dist[B] = 2 dist[C] = 5 dist[D] = 7 dist[E] = 9 dist[F] = inf S = {A, D, E, B, C} ``` 然后,选择距离起点最近的节点F,并更新与其相邻的节点E的距离。通过从A到B再到C再到F的距离,发现从起点A到节点F的距离更短,因此更新dist[F]的值为11,并将节点F加入节点集合S中。 ``` dist[A] = 0 dist[B] = 2 dist[C] = 5 dist[D] = 7 dist[E] = 9 dist[F] = 11 S = {A, D, E, B, C, F} ``` 此时,所有节点都已经加入节点集合S中,算法结束。最终得到的起点A到其它节点的最短距离如下所示: ``` dist[A] = 0 dist[B] = 2 dist[C] = 5 dist[D] = 7 dist[E] = 9 dist[F] = 11 ``` 在图表中,用红色标记出了每次选择的节点。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值