数据结构-最短路径问题-Dijkstra算法

 

对于这样一个例子,算法运行步骤:

1、从V[0]开始,初始化三个数组:

final数组表示目前为止是否找到从V0到对应点的最短路径,初始化的时候V0默认为TRUE,即到自己就是最短的。

dist数组表示目前为止能找到的最短的路径,起始的时候能找到V0到V1权值是10,到V4是5,因此初始化V[1]=10,V[4]=5,对于其他的点初始化为正无穷。

path数组记录最短路径上的前驱,和Prim算法的path数组作用相同。

2、进行第一轮处理:循环遍历所有的节点,找到还没确定最短路径且dist最小的顶点V[i],即final[i]=false&&dist[i]最小,令final[i]=true;则目前确定了V[0]到V[4]的最短路径是5

接着还要检查和V[4]相邻的所有顶点,检查相邻点V[j]的dist[j]和distV[i]+acro[i][j],若后者更小,则表示有一条更近的边。例如本处dist[1]=10>dist[4]+acro[4][1]。因此V[0]->V4->V[1]这个距离更近。更新dist[1]和path[1]

3、遍历其他的fial数组的值=false的点。直到找到V[0]到所有点的最短路径。

Dijstra算法时间复杂度分析:从上面步骤不难看出,有n个顶点,需要遍历n-1轮。每轮可以确定一个顶点的最短路径。

每一轮处理当中对于选中的顶点,要检查邻接点。

所以时间复杂度为O(n^2)

 Dijkstra算法小坑:

如果带权图里有负权值的边,Dijkstra算法可能会失效找不到最短的带权路径。  

对于这个例子,Dijkstra算法会失效

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值