- 1、本文档共16页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第七章 最短路径3
最短路径 (Shortest Path) 路径长度:在带权图中,路径长度是指该路径上各边的权值之和。 最短路径:如果从图中某一顶点(称为源点)到达另一顶点(称为终点)的路径可能不止一条,其中路径长度最小的路径称为这两点之间的最短路径。 问题: 1、单源点最短路径问题 :求从某个源点 vs到其它各个顶点之间的最短路径。 2、每一对顶点之间最短路径问题:求图中每一对顶点之间的最短路径 1、单源点最短路径 ?给定一个带权有向图D与源点 v,求从 v 到D中其它顶点的最短路径。限定各边上的权值大于0。 ?为求得这些最短路径, Dijkstra提出按路径长度的递增次序, 逐步产生最短路径的算法。首先求出长度最短的一条最短路径,再参照它求出长度次短的一条最短路径,依次类推,直到从顶点v到其它各顶点的最短路径全部求出为止。 (2) 设S是已经找出的最短路径终点集合,若下一条最短路径到达的的顶点为vj,则从vs出发到顶点vj的这条最短路径所经过的所有中间顶点(如果有的话)必定在S中。也就是说只有这条路径的最后一条弧才是从S内的某个顶点连接到S外的顶点vj。 证明:与(1)类似用反证法。假设从源点vs到顶点vj有一条更短的路径,它是经过了S外的某个顶点而到达到达vj的,设这条路径第一次经过的S外的顶点为vk (vk?vj),如图所示。那么,从vs到顶点vk的路径长度就比从vs到顶点vj的路径长度小,那么下一条最短路径到达的顶点就应该是vk,而不是vj。这与vj是下一条最短路径到达的顶点相矛盾。 如果定义一个数组dist[n],它的每个分量dist[i]存放从vs出发,中间只经过集合S中的顶点而到达vi的路径中长度最小的路径长度值。那么由这个结论可知,下一条最短路径的终点vj必定是不在S中且dist[i]值最小的顶点,即: dist[i] = Min { dist[k] | vk?V-S } 迪杰斯特拉算法的基本步骤 (1) 令S={ vs },并对每个顶点vi按下面的公式赋初值: (2) 选择一个顶点vj,使得: dist[j]=Min{dist[k] | vk?V-S }。 vj就是求得的下一条最短路径的终点,将vj并入到集合S中,即S=S∪{vj}。 (3) 对V-S中的每个顶点vk,修改dist[k]的值。 由于上一步中对S新增加了vj,V-S中那些与vj相连的顶点vk的dist[k]的值就可能减小。即: dist[j]+ wjk dist[k], 此时应修改所有这样的dist[k],使得: dist[k] = dist[j] + wjk。 (4) 重复步骤(2)和(3),直到S=V为止。这样就求出了图中从源点vs到其它顶点的最短路径长度的递增序列。 迪杰斯特拉算法的实现 用邻接矩阵表示的一个带权图 设置一个数组final[n]用来标记一个顶点是否已加入到S中。 为了保存从vs到其它顶点的最短路径,设立一个一维数组pre[n],若pre[i]=k,则表示在vs到vi的最短路径中,vi的前一个顶点是vk,即最短路径如(vs, …,vk, vi)。不难发现该最短路径中的子序列(vs, …,vk)一定是从vs到vk的最短路径,因此又可以由pre[k]的值找到vk的前一个顶点,依次类推,直到找到源点为止。这样就可以根据pre数组输出所有从vs到其它顶点的最短路径。 迪杰斯特拉算法描述如下: void Dijkstra(AdjGraph *G, int v) { int i,j,k,min; for ( j=0; jG-vexnum; j++){ pre[j] = v; dist[j] = G-adj[v][j]; final[j] = FALSE; } /*对数组dist、pre和final赋初值*/ dist[v] = 0; final[v] = TRUE; /* 置S = {v} */ for ( j=0; jG-vexnum; j++){ dist[k]=Minimum{ dist[i] | 0? i ? G-vexnum, !final[i] } min = dist[k]; /*求出当前最小的dist[k]*/ final[k] = TRUE; /*将第k各顶点并入S中*/ print_shortest(v, k); /*输出从v到k的最短路径*/ for ( i=0; iG-vexnum; i++){
您可能关注的文档
最近下载
- 2024广东德良投资集团有限公司招聘7人笔试参考题库及答案解析.docx
- 2024年内蒙古赤峰市中考英语试卷真题(含答案解析).docx
- 人教版化学高二上学期期末试卷及解答参考(2024-2025学年).docx VIP
- 施工应急预案专项施工方案.docx
- 模板工程专项施工方案(钢背楞)-图文.doc VIP
- 小学数学思维培养现状及发展策略研究.DOC
- 课题申报书:基于新时代红色基因传承的中职“课程思政”教学改革方法与实践研究.docx VIP
- 2024北京海淀初二(下)期末语文试卷及答案 .pdf VIP
- 2024广东德良投资集团有限公司招聘2人笔试备考试题及答案解析.docx
- 基于plc的自动售货机系统设计—学士学位论文.doc VIP
文档评论(0)