【题25】计算单源最短路问题(Dijkstra算法)--试题解析.docVIP

【题25】计算单源最短路问题(Dijkstra算法)--试题解析.doc

  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文档。上传文档
查看更多
【题25】计算单源最短路问题(Dijkstra算法)--试题解析

【题25】计算单源最短路问题(Dijkstra算法) 设G (V,E)是一个有向图,它的每一条边(U,V)∈E都有一个权W(U,V),在G中指定一个结点V0,要求把从V0到G的每一个结点Vj VJ∈V 的最短有向路找出来(或者指出不存在从V0到Vj的有向路,即V0不可达Vj)。 输入 顶点数n n*n的带权矩阵 输出 有n行,每行为顶点序号i和V0到Vi的最短路长 题解 1.算法的基本思路 解决单源最短路径的基本思想是把图中所有结点分为两组 第一组:包括已确定最短路径的结点; 第二组:包括尚未确定最短路径的结点; 我们按最短路径长度递增的顺序把第二组的结点加到第一组中去,直至v0可达的所有结点都包含于第一组。在这个过程中,总保持从v0到第一组各结点的最短路径长度都不大于从v0至第二组任何结点的路径长度。另外,每一个结点对应一个距离值。第一组结点对应的距离值就是由v0到此结点的最短路径长度;第二组结点对应的距离值就是v0经由第一组结点(中间结点)至此结点的最短路径长度。具体作法是: 初始时v0进入第一组,v0的距离值为0;第二组包含其它所有结点,这些结点对应的距离值这样确定(设vi为第二组中的结点) 然后每次从第二组的结点中选一个其距离值为最小的结点vm加到第一组中。每往第一组加入一个结点vm,就要对第二组的各结点的距离值作一次修正(设vi为第二组的结点): 若加进vm做中间结点使得v0至vi的路径长度更短(即vi的距离值 vm的距离值+Wmi),vi的距离(vi的距离值←vm的距离值+Wmi)。修改后再选距离值最小的一个结点加入到第一组中,…。如此进行下去,直至第一组囊括图的所有结点或再无可加入第一组的结点存在。下面,我们来证明这个算法: 显然,初始时对两个组的划分及各结点距离值的确定符合上述基本思想。因此要证明算法正确性,关键是证明每次往第一组加入结点vm后,其两个组的划分及结点距离值仍然符合要求。也就是要证明第二组中距离值最小的结点vm,其距离值为v0到vm的最短路径长度,且vm就是第二组中路径长度最小的结点。我们来证明这两点: ⑴ 若vm的距离值不是从v0到vm的最短路径长度,另有一条v0经由第二组某些结点(其中第一个结点设为vs)到达vm的路径,其长度比vm的距离值更小,即 vs的距离值 v0经由vs到vm的最短路径长度 vm的距离值 与vm是第二组中距离值最小的结点矛盾。所以vm的距离值就是从v0到vm的最短路径长度。 ⑵设vx是第二组中除vm外的任何其它结点。若v0至vx的最短路径上的中间结点为第一组的结点,由距离值的定义可知,其路径长度势必大于等于v0至vm的最短路径长度;若v0至vx的最短路径不仅包含第一组的结点为中间结点。设路径上第一个在第二组的中间结点为vy,则v0至vy的路径长度就是vy的距离值,已大于等于v0至vm的最短路径长度,那么v0到vx的最短路径长度当然也不会小于v0到vm的最短路径长度了,所以vm是第二组中最短路径为最小的结点。 2.变量说明 下面给出算法中的变量说明 设 n—图的结点数; adj—有向图的相邻矩阵。其中 dist—最短路径集合。其中 dist[i].prev0至vi的最短路径上,vi的前趋结点序号; dist[i].lengthv0至vI的最短路径长度,即vi的距离值; (1≤i≤n) Const n 图的结点数; Type path record 路径集合的结点类型 length:real; pre:0n; end; var adj:array[1n,1n] of real 相邻矩阵 dist:array[1n] of path; 3.算法流程 计算单源最短路径的过程如下: fillchar adj,sizeof adj ,0 ; 建立相邻矩阵adj for i: 1 to n do for j: 1 to n do if(i,j)∈E then adj[i,j]←wij else adj[i,j]←∞; for i: 1 to n do begin dist[i].lengthadj[v0,i]; if dist[i].length then dist[i].prev0 else dist[i].pre0; end; for adj[v0,v0]1; v0进入第一组 repeat min←∞; u0; for i: 1 to n do u if adj[i,i] 0 and dist[i].length min then begin ui; mindist[i].length; end; then if u 0 then begin adj[u,u]1; u进入第一组 for i: 1 to n do u可达的结点距离值 if adj[i,i] 0

文档评论(0)

haocen + 关注
实名认证
文档贡献者

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

1亿VIP精品文档

相关文档