Dijkstra(迪杰斯特拉)算法

Dijkstra(迪杰斯特拉)算法的思想是广度优先搜索(BFS) 贪心策略。
是从一个顶点到其余各顶点的最短路径算法,节点边是不各自不同的权重,但都必须是正数
如果是负数,则需要 Bellman-Ford 算法
如果想求任意两点之间的距离,就需要用 Floyd 算法

image

求节点0 -> 4 的最短路径

  • 每次从未标记的节点中选择距离出发点最近的节点,标记,收录到最优路径集合中
  • 计算刚加入节点A的邻近节点B的距离(不包括标记的节点),若(节点A的距离 + 节点A到节点B的边长)< 节点B的距离,就更新节点B的距离和前序节点

初始状态

节点012345678备注
最优节点每一步,找出未标记的节点中,最短的距离,标记为最优节点
出发节点当前节点,到每个节点的距离,刚开始,所有的节点都认为是 ∞ 无穷大
前序点为了记录最短路径,需要记录每个节点的前序节点

从0出发

节点012345678
最优节点✔️
0 出发0
前序点

首先,节点0的距离是0,所有节点中距离最短的是它自己,0为最优路径中的节点

更新0邻近节点1、7

image

从0点出发,到 相邻的节点 1、7
0->1 = 4 , 节点 1 此时为 ∞,因此 节点 1 的 距离 标为 4,前序节点为 0
0->7 = 8 , 节点 7 此时为 ∞,因此 节点 7 的 距离 标为 8,前序节点为 0

从未标记最优节点(1~8)中,找距离出发点最小的节点 => 1

节点012345678
最优节点✔️
0 出发048
前序点00

更新1邻近节点2、7

上一次的最优节点是 1

image

从0点出发,到 节点 1 相邻的节点 2、7
0->1->2 = 4 + 8 = 12 , 节点 2 此时为 ∞,因此 节点 2 的 距离 标为 12,前序节点为 1
0->1->7 = 4 + 11 = 15 , 节点 7 已有值 8,8<15,因此 节点7 的 距离、前序节点保持不变
从未标记最优节点(2~8)中,找距离出发点最小的节点 => 7

节点012345678
最优节点✔️
0 出发04128
前序点010

更新7邻近节点 8、6

上一次的最优节点是 7

image

从0点出发,到 节点 7 相邻的节点 8、6
0->7->8 = 8 + 7 = 15 , 节点 8 此时为 ∞,因此 节点 8 的 距离 标为 15,前序节点为 7
0->7->6 = 8 + 1 = 9 , 节点 6 此时为 ∞,因此 节点 6 的 距离 标为 9,前序节点为 7
从未标记最优节点(2~6、8)中,找距离出发点最小的节点 => 6

节点012345678
最优节点✔️
0 出发04129815
前序点01707

更新6邻近节点 8、5

上一次的最优节点是 6

image

从0点出发,到 节点 6 相邻的节点 8、5
0->7->6->8 = 8 + 1 + 6 = 15 , 节点 8 已有值 15,15=15,因此 节点 8 的 距离、前序节点保持不变
0->7->6->5 = 8 + 1 + 2 = 11 , 节点 5 此时为 ∞,因此 节点 5 的 距离 标为 11,前序节点为 6
从未标记最优节点(2~5、8)中,找距离出发点最小的节点 => 5

节点012345678
最优节点✔️
0 出发0412119815
前序点016707

更新5邻近节点 2、3、4

上一次的最优节点是 5

image

从0点出发,到 节点 5 相邻的节点 2、3、4
0->7->6->5->2 = 8 + 1 + 2 + 4 = 15 , 节点 2 已有值 12,12<15,因此 节点2 的 距离、前序节点保持不变
0->7->6->5->3 = 8 + 1 + 2 + 14 = 25 , 节点 3 此时为 ∞,因此 节点 3 的 距离 标为 25,前序节点为 5
0->7->6->5->4 = 8 + 1 + 2 + 10 = 21 , 节点 4 此时为 ∞,因此 节点 4 的 距离 标为 21,前序节点为 5
从未标记最优节点(2、3、4、8)中,找距离出发点最小的节点 => 2

节点012345678
最优节点✔️
0 出发04122521119815
前序点01556707

更新2邻近节点 3、8

上一次的最优节点是 2

image

从0点出发,到 节点 2 相邻的节点 3、5、8,节点5已标记,所以不处理节点5
0->1->2->3 = 4 + 8 + 7 = 19 , 节点 3 已有值 25,25>19,因此 节点 3 的 距离 标为 19,前序节点为 2
0->1->2->8 = 4 + 8 + 2 = 14 , 节点 8 已有值 15,15>14,因此 节点 8 的 距离 标为 14,前序节点为 2
从未标记最优节点(3、4、8)中,找距离出发点最小的节点 => 8

节点012345678
最优节点✔️
0 出发04121921119814
前序点01256702

更新8邻近节点

上一次的最优节点是 8

image

8的邻近节点,2、7、6 都已被标记为最优节点,所以不需要处理
从未标记最优节点(3、4)中,找距离出发点最小的节点 => 3

节点012345678
最优节点✔️
0 出发04121921119814
前序点01256702

更新3邻近节点

上一次的最优节点是 3

image

最优节点3的邻近节点:2、5、4中 2、5都已被标记为最优节点,处理 4
0->1->2->3->4 = 19 + 9 = 28 , 节点 4 已有值 21,21<28,因此 节点 4 的 距离 、前序节点保持不变
从未标记最优节点(4)中,找距离出发点最小的节点 => 4

节点012345678
最优节点✔️
0 出发04121921119814
前序点01256702

已时已全部结束

最短距离

从出发点0 到节点 4 的最短距离 = 21

最短路径

反向追溯
4 的前序节点 5,5的前面是 6 ... => 4 -> 5 -> 6 -> 7 -> 0
因此 0 -> 7 -> 6 -> 5 -> 4 是最短路径

  • 33
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Dijkstra迪杰斯特拉算法是一种典型的最短路径算法,可以用于计算一个节点到其他节点的最短路径。它的主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止,使用的是广度优先搜索的思想。该算法通过不断更新起始点到其他节点的距离,选择当前距离最短的节点进行扩展,直到所有节点都被扩展完毕,找到起始点到其他节点的最短路径。Dijkstra算法在网络路由、地图导航等领域有广泛应用。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [C++实现Dijkstra(迪杰斯特拉)算法](https://download.csdn.net/download/weixin_38692122/12724830)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [Dijkstra迪杰斯特拉算法](https://blog.csdn.net/qq_43461641/article/details/100632351)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [DijkstraAlgorithm(迪杰斯特拉算法)](https://blog.csdn.net/qq_45740348/article/details/113575420)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

!chen

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值