6-10图-最短路径问题Dijkstra算法

最短路径问题——Dijkstra算法

一.基础知识
Dijkstra算法(迪杰斯特拉算法)
三个数组
(1)final[ ]:标记各顶点是否已找到最短路径
(2)dist[ ]:最短路径长度,无路径用∞表示
(3)path[ ]:路径上的前驱,如:path[2]=1表示由1到2的路径。起点无前驱,path置-1;无路径无前驱,path置-1

二.表示过程

起始点:V0
初态三数组表:

V0V1V2V3V4
final××××
dist0105
path-10-1-10

此时dist为V0不经过×点到各顶点的最短路径
在这里插入图片描述
找到最小的dist,将对应的final置√,此时V4已找到最短路径

通过新加入顶点V4 与原V0的dist表 对比选最小值,更新dist表
即:通过V4找更小
V4连通V1、V2、V3
对应路径长度分别为:3+5=8、9+5=14、2+5=7
8<10更新、14<∞更新、7<∞更新
更新dist及path表

V0V1V2V3V4
final×××
dist081475
path-14440

在这里插入图片描述
找到×中最小的dist,将对应final改为√
通过新加入的V3与当前的dist比较,选择小的更新数组
V3有到V0和V2的路径,只有V2是×
到V2路径长度为5+2+6=13<14,更新dist[2]和path[2]

V0V1V2V3V4
final××
dist081375
path-14340

在这里插入图片描述
选择×中最小的dist,将其final置√
最后通过新加入的V1,对比其到V2的路径长度5+3+1=9<13,更新dist[2]和path[2]

V0V1V2V3V4
final×
dist08975
path-14140

在这里插入图片描述
完成,将V2的final置√

V0V1V2V3V4
final
dist08975
path-14140

通过表格观察得到
V0到V2的最短路径长度为:dist[2]=9
最短路径通过path数组得到:2←1←4←0

三.时间复杂度

过程回顾:
(1)循环遍历所有顶点,找到×且当前dist最小,修改final。需要O(n)
(2)检查所有邻接自Vi的顶点,观察是否是×且小于dist,更新dist和path,需要O(n)

总共需要2O(n),即O(n)

一个n-1轮,即(n-1)*O(n),即O(n²)

四.用于负权值带权图

在这里插入图片描述
从V0开始

V0V1V2
final××
dist0107
path-100
V0V1V2
final×
dist0107
path-100

在这里插入图片描述

V0V1V2
final
dist0107
path-100

则从V0到V2最短路径长度为7,最短路径为0→2

但V0到V2最短路径长度为10+(-5)=5,最短路径为0→1→2

Dijkstra算法出现问题,因此Dijkstra算法不适用于有负权值的带权图

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

卡__卡

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

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

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

打赏作者

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

抵扣说明:

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

余额充值