单源最短路径问题Dijkstra算法的c语言实现

       求单源最短路径是图论中比较基本的问题,通常的Dijkstra算法是按阶段进行的,每个节点标有处理和未处理状态的标记,设立一个数组,每个数组中第i个元素为源节点到第i个节点的最短路径(当然,该数组的初值是依照图赋的,邻接节点赋对应边的权值,其他节点赋无穷大)。在Dijkstra算法的每一个阶段,将未处理的节点放入一个集合S,扫描S中距离最小的一个节点v,将v置为处理状态。然后在剩下的所有未处理节点中,对于每个节点w,如果w对应的距离小于v对应的距离加上v到w的距离,则将w对应的距离更新为v对应的距离加上v到w的距离。直到S为空,算法结束。

       本文换了一种思路,考虑按照层序来遍历节点。我们先来看一下什么是层序。如下图所示(《数据结构与算法分析——c语言描述》fig9.20),令源节点为v1(第一层),因为v2和v4与v1邻接,则可以称v2和v4层序相同,即位于第二层,考虑v2,v4与v5与之邻接,位于第三层序。值的注意的是,v4的层序发生了变化,但这并不影响结果。因为按层序遍历节点只是一种搜索的方式v4在第一层序中已经计算过,但路径不同(第一次是v1->v4,第二次是v1->v2->v4)。显然,v4处的距离值取小的那一个。计算完相同层序的节点后,程序继续计算下一层序的节点,从源节点出发,逐层往外推进。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值