单源点最短路径--2

4.有向无环图的单源点最短路径

有向无环图的单源点最短路径只需要将所有的边进行一次松弛即可,但是松弛的顺序是先对图进行拓扑排序,排序后的序列便是堆结点的访问顺序,然后根据访问的顺序对其所有的出边进行一次松弛操作。

例子:设置源结点为s即其时间设置为0

单源点最短路径--2 - 雨竹清风 - 雨竹清风的博客

 其拓扑顺序为:r,s,t,x,y,z

首先从r开始对其所有的出边进行一次松弛操作。结果如下所示:

单源点最短路径--2 - 雨竹清风 - 雨竹清风的博客

 绿色代表的是本次执行时的结点。

s出发对所有出边进行松弛。

单源点最短路径--2 - 雨竹清风 - 雨竹清风的博客

t出发对所有出边进行松弛。

 单源点最短路径--2 - 雨竹清风 - 雨竹清风的博客

  x 出发对所有出边进行松弛。

单源点最短路径--2 - 雨竹清风 - 雨竹清风的博客
  y 出发对所有出边进行松弛。
单源点最短路径--2 - 雨竹清风 - 雨竹清风的博客
  z 出发对所有出边进行松弛。
单源点最短路径--2 - 雨竹清风 - 雨竹清风的博客
  5.Dijkstra 算法

Dijkstra算法解决的是带权的有向图上的单源点最短路径问题,但要求其权值不能为负数。一个实现很好的Dijkstra算法要比Bellman-ford算法运行时间要低

算法总是在V-S中选择最近的顶点加入到S集合中,所以说使用了贪心策略。V是顶点的集合,S是从源结点s到集合中的顶点的最终最短路径的权值均已经确定。

例子:

原图:

单源点最短路径--2 - 雨竹清风 - 雨竹清风的博客

s加入到S集合中,从s出发修改其邻接点的d(从源结点sv结点的最短路径的上界)

单源点最短路径--2 - 雨竹清风 - 雨竹清风的博客

 选择一个距离s最近的y结点,将y加入S集合中,从y结点开始对每一条出边进行一次松弛操作。

单源点最短路径--2 - 雨竹清风 - 雨竹清风的博客

  选择一个不在S集合中的且d值最小的结点z,对z的所有的出边进行一次松弛操作。

单源点最短路径--2 - 雨竹清风 - 雨竹清风的博客

选择一个不在S集合中的且d值最小的结点t,对t的所有的出边进行一次松弛操作。

单源点最短路径--2 - 雨竹清风 - 雨竹清风的博客

 最后一次操作:

单源点最短路径--2 - 雨竹清风 - 雨竹清风的博客

  代码实现:

单源点最短路径--2 - 雨竹清风 - 雨竹清风的博客

 单源点最短路径--2 - 雨竹清风 - 雨竹清风的博客

  单源点最短路径--2 - 雨竹清风 - 雨竹清风的博客
  总思路:

1. 找到从源结点v0可达的结点中最短的一个结点v,v加入到结果集finial中。

2. 从该结点v出发,检测是否有一个结点w,使得

minV + mygraph.weight[v][w] < D[w] ,若有则记录下来,记录其路径(w包括自己)


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值