第18讲 第七章 图(四).pptVIP

  1. 1、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
* * 第18讲 第七章 图(四) 7.7 最短路径 7.7.1 路径的概念 在一个无权的图中,若从一顶点到另一顶点存在着一条路径,则称该路径长度为该路径上所经过的边的数目,它等于该路径上的顶点数减1。由于从一顶点到另一顶点可能存在着多条路径,每条路径上所经过的边数可能不同,即路径长度不同,我们把路径长度最短(即经过的边数最少)的那条路径叫做最短路径,其路径长度叫做最短路径长度或最短距离。 对于带权的图,考虑路径上各边上的权值,则通常把一条路径上所经边的权值之和定义为该路径的路径长度或称带权路径长度。从源点到终点可能不止一条路径,把带权路径长度最短的那条路径称为最短路径,其路径长度(权值之和)称为最短路径长度或者最短距离。 7.7.2 从一个顶点到其余各顶点的最短路径 问题:给定一个带权有向图G与源点v,求从v到G中其他顶点的最短路径,并限定各边上的权值大于或等于0。 采用狄克斯特拉(Dijkstra)算法求解 基本思想是:设G=(V,E)是一个带权有向图, 把图中顶点集合V分成两组: 第一组为已求出最短路径的顶点集合(用S表示,初始时S中只有一个源点,以后每求得一条最短路径v,…vk,就将vk加入到集合S中,直到全部顶点都加入到S中,算法就结束了) 第二组为其余未确定最短路径的顶点集合(用U表示)。 按最短路径长度的递增次序依次把第二组的顶点加入S中。在加入的过程中,总保持从源点v到S中各顶点的最短路径长度不大于从源点v到U中任何顶点的最短路径长度。此外,每个顶点对应一个距离,S中的顶点的距离就是从v到此顶点的最短路径长度,U中的顶点的距离从v到此顶点只包括S中的顶点为中间顶点的当前最短路径长度。 狄克斯特拉算法的具体步骤如下: (1)初始时,S只包含源点,即S={v},v的距离为0。U包含除v外的其他顶点,U中顶点u距离为边上的权(若v与u有边v,u)或∞(若u不是v的出边邻接点)。 (2)从U中选取一个距离v最小的顶点k,把k加入S中(该选定的距离就是v到k的最短路径长度)。 (3)以k为新考虑的中间点,修改U中各顶点的距离:若从源点v到顶点u(u∈U)的距离(经过顶点k)比原来距离(不经过顶点k)短,则修改顶点u的距离值,修改后的距离值的顶点k的距离加上边k,u上的权。 (4)重复步骤(2)和(3)直到所有顶点都包含在S中。 S U v0到0~6各顶点的距离 {0} {1,2,3,4,5,6} {0,4,6,6,∞,∞,∞} {0,1} {2,3,4,5,6} {0,4,5,6,11,∞,∞} {0,1,2} {3,4,5,6} {0,4,5,6,11,9,∞} {0,1,2,3} {4,5,6} {0,4,5,6,11,9,15} {0,1,2,3,5} {4,6} {0,4,5,6,10,9,17} {0,1,2,3,5,4} {6} {0,4,5,6,10,9,16} {0,1,2,3,5,4,6} {} {0,4,5,6,10,9,16} 则v0到v1~v6各顶点的最短距离分别为4、5、6、10、9和16。 狄克斯特拉算法如下(n为图G的顶点数,v0为源点编号): void Dijkstra(int cost[][MAXV],int n,int v0) { int dist[MAXV],path[MAXV]; int s[MAXV];int mindis,i,j,u; for (i=0;in;i++) { dist[i]=cost[v0][i]; /*距离初始化*/ s[i]=0; /*s[]置空*/ if (cost[v0][i]INF) /*路径初始化*/ path[i]=v0; else path[i]=-1; } s[v0]=1;path[v0]=0; /*源点编号v0放入s中*/ for (i=0;in;i++)

文档评论(0)

沃爱茜 + 关注
实名认证
文档贡献者

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

1亿VIP精品文档

相关文档