贪心算法之单源最短路径问题

给定带权有向图G=(V,E),其中每条边的权都是非负数。给定一个起始顶点,成为源。计算从源到所有其他定点的最短路径长度。路径长度是各边权重之和。该问题称为单源最短路径问题。
基本思想:Dijkstra算法(迪杰斯特拉算法)是解单源最短路径问题的贪心算法
Dijkstra算法特点:以起始点为中心向外层层扩展,直到扩展到终点为止,是一种广度优先搜索方法。
Dijkstra算法原理:最优子路径存在(贪心算法的最优子结构性质)。假设S→F存在一条最短路径SF,且该路径经过点A,那么SA子路径一定是S→A的最短路径。
该算法的时间复杂度是o(n^2).

实例:
1、带权有向图,从0源起始,计算最短路径长度。
这里写图片描述
加入S集合中顶点的顺序:{0,4,2,3,1}
步骤:
(1)先建立两个集合:用来存已经找到的最短路径的结点即S={};用来存未找到的最短路径的结点即U={}。SU互补,S U U=全集(所有结点),当U为空时,算法结束,找到最短路径。
(2)若源与点i直接相连,则dist[i]等于权重,若源与i不直接相连,则dist[i]=∞。
(3)建立数组dist[i],存源到i点的距离,选取最小的dist[i]存入到S中,将i从U中移除。随着找到的路径结点更新源i 到未找到点的距离dist[i]。若点i已经在S中之后将不再更新dist[i].
(4)重复(3)步骤,直到U为空时,结束算法。
上图中左图是带权有向图,其中路线上的值为点到点的权重,右表是Dijkstra算法的迭代过程,每次迭代选取红色圆圈的结点从U移到S,并根据S中已有结点更新源到i的距离dist[i].迭代终止的条件是U为空。

Dijkstra算法的重点:需要选取最小的dist[i]和根据找到的结点更新dist[i].

2、带权有向图,从0源起始,计算最短路径长度。
这里写图片描述
加入S集合中顶点的顺序:{0,1,3,2,4}
3、带权有向图,从1源起始,计算最短路径长度。
这里写图片描述
加入S集合中顶点的顺序:{1,2,4,3,5}

  • 19
    点赞
  • 72
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值