数据结构中的图.pptVIP

  • 3
  • 0
  • 约1.89万字
  • 约 67页
  • 2020-01-13 发布于湖北
  • 举报
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 7.6 单源最短路径 最短路径问题是图的典型应用问题。例如某一地区的一个公路网,给定了该网内的n个城市以及这些城市之间的相通公路的距离,能否找到从某一城市A到另一城市B之间一条距离最近的通路呢?如果将城市用顶点表示,城市间的公路用边表示,公路的长度作为边的权值,这个问题就归结为在有向网图中求顶点A到顶点B的所有路径中,边的权值之和最小的一条路径,这条路径就是两点之间的最短路径,并称路径上的第一个顶点为源点,最后一个顶点为终点。在非网图中最短路径是指两点之间经过的边数最少的路径。 7.6 单源最短路径 从源点到终点之间的路径可能存在三种情况: 没有路径相通 只有一条路经,则此路径就是最短路径 存在多条路径,则必存在一条最短路径 b a g f e c d 30 20 10 9 18 5 15 10 8 12 bàf: 没有路径 bàa: 只有一条路径 bàd: 存在三条路径 (b-d):30 (b-c-e-d):27 (b-a-g-c-e-d):64 其中,(b-c-e-d)为最短路径 7.6 单源最短路径 如何求得从源点到各终点的最短路径?Dijkstra提出了一种按路径长度递增的次序求从源点到各终点的最短路径的算法。 假设从源点v0到各终点v1,v2,…,vk之间存在最短路径,其路径长度分别为l1,l2,…,lk,并且lp(1=p=k)为其中的最小值,即从源点v0到终点vp的最短路径是从源点到其他终点的最短路径中长度最短的一条路径,这条路径上必定只有一条弧,否则它就不可能是所有最短路径中的最短者。 第二条次短(从源点v0到终点vq)的最短路径只能产生以下两种情况: 从源点到该点存在弧v0,vq 从已求得的最短路径的顶点vp到该点有弧vp,vq存在,且v0,vp 和vp,vq上的权值之和小于v0,vq上的权值。 依此类推,一般情况下,假设已求得最短路径的顶点有{vp1,vp2,…vpk},则下一条最短路径的产生只可能是已求出的这些最短路径的延伸,也就是从源点间接到达终点,或者是从源点直接通过一条弧到达终点。 7. 6 单源最短路径 根据以上思路,Dijkstra算法描述如下: 1. 假设AS[n][n]为有向网的邻接矩阵,S为已找到最短路径的终点集合,其初始状态只含一个顶点,即源点。另设一维数组Dist[n],其中每个分量表示当前所找到的从源点出发(经过集合S中的顶点)到各个终点的最短路径长度,则Dist的初值为:Dist[k]=AS[i,k] 2. 选择u,使得 Dist[u]=min{Dist[w] |w ∈ V-S} 3. 修改Dist数组中所有尚未找到最短路径的终点的对应分量值, 如果 Dist[u]+AS[u,w]Dist[w] 则 Dist[w]=Dist[u]+AS[u,w] 4. 重复上述2和3的操作n-1次,即可求得从源点到所有终点的最短路径。 此外,为了记下长度为Dist[w]的最短路径,还需要附设路径矩阵Path[n][n]。 b a g f e c d 30 20 10 9 18 5 15 10 8 12 b Dist[7] Path[7][7] S: {b} V-S: {a,c,d,e,f,g} a b c d e f g b b c d a Dist和Path的初始状态,求得从b到c的最短路径 c 15 S: {b,c} V-S: {a,d,e,f,g} b g c d b b e c e e 修改Dist和Path的值, 求得从b到e的最短路径 30 27 29 S: {b,c,e} V-S: {a,d,f,g} 修改Dist和Path的值, 求得从b到a的最短路径 S: {b,c,e,a} V-S: {d,f,g} 修改Dist和Path的值, 求得从b到d的最短路径 g S: {b,c,e,a,d} V-S: {f,g} 修改Dist和Path的值, 求得从b到g的最短路径 a S: {b,c,e,a,d,g} V-S: {f} 修改Dist和Path的值, 可见从b到f没有路径 至此,从源点b出发到各终点的最短路径求解完毕,最短路径序列如矩阵Path所示 a b c d e f g a b c d e f g a b c d e f g * * * * * * * * * * * * * * * * * * * * * * * * * * * 7.3.2 广度优先搜索遍历图

文档评论(0)

1亿VIP精品文档

相关文档