7.6最短路径

最短路径问题:如果从图中某一顶点(称为源点)
到达另一个顶点(称为终点)的路径可能不止一条,如何找到一条路径使得沿此路径上各边上的权值总和达到最小。

求带权有向图最短路径问题分为两种情况:

  • 求从一个顶点到其他顶点的最短路径,称为单源最短路径问题
  • 求每对顶点之间的最路径,称为多源最短路径问题

单源最短路径问题

  1. 问题的提法:给定一个带权有向图G与源点v,求从v到G中其他顶点的最短路径。限定各边上的权值大于或等于0.
  2. 为求得这些路径最短路径,迪杰斯特拉(Dijkstra)提出按路径长度的递增次序,逐步产生最短路径的算法。
  3. 首先求出长度最短的一条路径;
  4. 再参照它求出长度次短的一条最短路径;
  5. 依次类推,直到从顶点v到其它各顶点的最短路径全部求出为止。

**

Dijkstra算法的具体步骤如下:

  1. 初始时,顶点集S只包含源点v,即S={V},到顶点v到自己的距离为0.顶点集U=V-S包含除v外的其他顶点,源点v到U中顶点i的距离为边(弧)上的权(若v与i有边<v,i>)或∞(若顶点i不是v的出边相邻点)
  2. 从U中选取一个顶点u,它是源点v到U中距离最小的一个顶点,然后把顶点u加入S中(该选定的距离就是源点v到顶点u的最短路径长度)。
  3. 顶点u为新考虑中间点,修改源点v到U中各顶点j(j∈U)的距离。
  4. 重复步骤2和3直到S包含所有的顶点,即U为空。

41.(10分)带权图(权值非负,表示边连接的两顶点间的距离)的最短路径问题是找出从初始顶点到目标顶点之间的一条最短路径。假设从初始顶点到目标顶点之间存在路径,现有一种解决该问题的方法,具体的解题步骤如下:
(1) 设最短路径初始时仅包含初始顶点,令当前顶点u为初始顶点。
(2) 选择离u最近且尚未在最短路径中的一个顶点v,加入到最短路径中,修改当前顶点u=v。
(3) 重复步骤(2)直到u是目标顶点时为止。
请问上述方法能否求得最短路径?若该方法可行,请证明之;否则,请举例说明。
说明:本题为2009年全国考研题。

解:该方法不一定能(或不能)求得最短路径。如图(a)中,设初始顶点为1,目标顶点为4,欲求从顶点1到顶点4之间的最短路径。显然这两顶点之间的最短路径长度为2。但利用给定的方法求得的路径长度为3,这条路径并不是这两个顶点之间的最短路径。如图(b)中,设初始顶点为1,目标顶点为4,欲求从顶点1到顶点4之间的最短路径。利用给定的方法,无法求出顶点1到顶点4的路径。

实现迪杰斯特拉算法:

  • 设置一个距离数组dist[0…n-1],dist[i]用来保存从源点v到顶点i的目前最短路径长度。
  • path[j]保存源点到顶点J的最短路径,实际上为最短路径上的前一个顶点u,即:path[j]=u.
  • 当求出最短路径后,由path[j]=u.
  • 当求出最短路径后,由path[j]向前推出源点到顶点j的最短路径

7.6.2多源短路径算法

  • 用Dijkstra算法可以求得有向图G=(V,E)中每一对顶点间的最短路径。方法是:每次以一个不同的顶点为源点重复Dijkstra算法便可求得每一对顶点时间的最短路径,时间复杂度是O(n3)
  • 弗洛伊德(Floyd)提出了另一个算法,其时间浮渣度仍是O(n3),但算法形式更为简明,步骤更为简单
  • 假设有向图G=(V,E)采用邻接矩阵g表示,另外设置一个二维数组D用于存放当前顶点之间的最短路径长度,即分量D[i][j]表示当前顶点i到顶点j的最短路径长度。
  • 弗洛伊德算法的基本思想:递推产生一个矩阵序列D0、D1、。。。。。Dk、。。。。。Dn-1,其中Dk[i][j]表示从顶点i到顶点j的路径上所经过的顶点编号不大于k的最短路径长度
  • 另外用二维数组path保存最短路径,它与当前迭代的次数有关,即当迭代完毕,path[i][j]存放从顶点i到顶点j的最短路径的前一个顶点的编号
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值