数据结构与算法之最短路径-Dijkstra算法

接上文的 最短路径-BFS算法

BFS 算法的局限性

|350
带权路径长度——当图是带权图时,一条路径上所有边的权值之和,称为该路径的带权路径长度之和

BFS 算法求单源最短路径只适用于无权图,或所有边的权值都相同的图

最短路径问题

  1. 单源最短路径
    1. BFS 算法 (无权图)
    2. Dijkstra 算法 (带权图、无权图)
  2. 各顶点间的最短路径
    1. Floyd 算法 (带权图、无权图)

Dijkstra 算法

算法思想

首先观看如下两副图:
|625
初试:

  1. v 0 v_0 v0开始,初始化三个数组信息如下
    1. final[5]:标记各顶点是否已找到最短路径
    2. dist[5]:最短路径长度
    3. path[5]:路径上的前驱
      第一轮:
  2. 循环遍历所有结点,找到还没确定最短路径,且 dist 最小的顶点 V i V_i Vi,令 final[i]=true.|450
  3. 检查所有邻接自 V i V_i Vi的顶点。若其final 值为false,则更新dist 和path 的信息|675
    第二轮:
  4. 循环遍历所有结点,找到还没确定最短路径,且dist 最小的顶点 V i V_i Vi,令final[i]=true.|550
  5. 检查所有邻接自 V i V_i Vi的顶点。若其 final 值为 false,则更新 dist 和 path 的信息 |625
    …N 轮之后…
    直到 final 数组全为 true,循环结束

计算机思路

  1. 初始:
    1. 若从 v_0 开始,令 final[0]=true;dist[0]=0;path[0]=0
    2. 其余顶点 final[k]=false;dist[k]=arcs[0][k];1path[k]=(arcs[0][k]==9999)?-1:0
  2. n-1 轮处理:
    1. 循环遍历所有顶点,找到还没确定最短路径,且 dist 最⼩的顶点 Vi,令 final[i]=ture。并检查所有邻接⾃Vi 的顶点,对于邻接⾃Vi 的顶点 Vj ,若 final[j]==falsedist[i]+arcs[i][j] < dist[j],则令 dist[j]=dist[i]+arcs[i][j]; path[j]=i。(注: arcs[i][j] 表示 Vi 到 Vj 的弧的权值)

时间复杂度: O ( n 2 ) O(n^2) O(n2) O ( ∣ V ∣ 2 ) O(|V|^2) O(V2)

如何使用数组信息?

|600
v 0 v_0 v0 v 2 v_2 v2的最短 (带权) 路径长度为:dist[2]=9
通过 path[5] 可知,v_0 到 v_2 的最短 (带权) 路径: v 2 v_2 v2<– v 1 v_1 v1<– v 4 v_4 v4<– v 0 v_0 v0

这里需要结合 Prim 算法 一起进行比较,二者比较类似

|475

用于负权值带权图

|650
事实上 v_0 到 v_2 的最短带权路径长度为 5
结论:Dijkstra 算法不适用于有负值的带权图


  1. 弧的长度,不存在弧的话那就是无穷或者 9999 特殊大整型 ↩︎

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

five-five

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

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

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

打赏作者

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

抵扣说明:

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

余额充值