哈工大数据结构第5章-图.ppt

  1. 1、本文档共107页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
哈工大数据结构第5章-图

* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 5.10 最短路径(Shortest Path) 最短路径问题:如果从图中某一顶点(称为源点)到达另一顶点(称为终点)的路径可能不止一条,如何找到一条路径使得沿此路径上各边上的权值总和达到最小。 问题解法 边上权值非负情形的单源最短路径问题 — Dijkstra算法 (讲此算法) 边上权值为任意值的单源最短路径问题 —Bellman和Ford算法 (不讲) 所有顶点之间的最短路径 — Floyd算法 (讲此算法) * 边上权值非负情形的单源最短路径问题 问题的提法: 给定一个带权有向图G与源点v,求从v 到G中 其它顶点的最短路径。限定各边上的权值大于或等于0。 为求得这些最短路径,Dijkstra提出按路径长度的递增次序, 逐 步产生最短路径的算法。首先求出长度最短的一条最短路径,再 参照它求出长度次短的一条最短路径,依次类推,直到从顶点 v 到其它各顶点的最短路径全部求出为止。 其它最短路径问题 单目标最短路径问题: 找出图中每个顶点v 到某个指定结点c 最短路径(只需每边取反) 单结点对间最短路径问题: 对于某对顶点u 和v,找出u 到v 的一条最短路径(以u 为源点) 所有顶点间的最短路径问题: 对图中每对顶点u 和v,找出u 到v 的最短路径(以每个顶点为源) * 单源最短路径:Dijkstra算法 基本思想:是按路径长度递增的次序生成从源点v 到其它顶点的最短路径的贪心算法。把图中的所有顶点分成两组,第一组包括已确定最短路径的顶点,第二组包括尚未确定最短路径的顶点,按最短路径长度递增的顺序逐个把第二组的顶点加到第一组中去,直到从源点v 出发可以到达的顶点都包含在第一组中。在整个过程中,总保持从v 到第一组各顶点的最短距离,都不大于从v 到第二组的任何顶点的最短距离。另外,每个顶点对应一个最短距离,第一组的顶点的最短距离值就是从v 到此顶点(且只包含第一组顶点为中间顶点)的最短距离长度。 * 算法5.7 Dijkstra算法 输入:带权有向图G=(V,E) (其中V={ 1, 2, …n })的邻接矩阵C。 输出:从源点1到其余顶点的最短路径长度(及路径)算法要点: 1. 将V分为两个集合S和V-S,其中S是最短路径已经确定的顶点集合,初值为S={ 1 },V-S是最短路径尚未确定的顶点集合。设数组D记录从源点到其余各结点当前的最短路长,初始为D[i]=C[1][i],i=2,3,…n。设数组P记录从源点到其余顶点最短路径上最后经过的顶点,初始为P[v]=1(源点),v≠1。 2. 从S之外即V-S中选取一个顶点w,使D[w]最小(即选这样的w, D[w]=min{ D[i]| i∈V-S }) ,于是从源点到达w只通过S中的顶点,且是一条最短路径(选定路径),并把w加入集合S。 3. 调整D中记录的从源点到V-S中每个顶点的最短距离,即从原来的D[v]和D[w]+C[w][v]中选择最小值作为D[v]的新值(且P[v]=w)。(是由w加入到S中可能引起的当前最短路径的变化) 4. 重复上述过程,直到S中包含V的所有顶点为止。结果数组D就记录了从源到V中各顶点的最短距离(数组P记录最短路径)。 * Dijkstra算法基本思想: 集合S的初值为S={1} D为各顶点当前最小路径 从V-S中选择顶点w,使D[w]的值最小并将w加入集合S,则w的最短路径已 求出。 调整其他各结点的当前最小路径 D[k]=min{D[k], D[w]+C[w][k]} 直到S中包含所有顶点 * 算法的逐步求精过程: void Dijkstra( G ) { S = { 1 } ; for( i=2; i=n; i++ ){ D[i] = C[1][i]; P[i]=1; } for( i=1; in; i++ ) { 从V-S中选出一个顶点w,使D[w]最小; S = S + {w} ; for ( V-S中的每一个顶点v ) if (D[v]D[w]+C[w][v] ){ D[v]=D[w]+C[w][v]; P[v]=w; } } } /* 采用邻接矩阵时间复杂性O(n2),采用 邻接表时时间复杂度O(e)*/ * 算法: void Dijkstra(GRAPH G, costtype D[MAXVEX+1] ) { int S[MAXVEX+1] ; for ( i=1 ; i=n;

文档评论(0)

qwd513620855 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档