网站大量收购闲置独家精品文档,联系QQ:2885784924

数据结构第七章2009.ppt

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

求最短路径的迪杰斯特拉算法:按路径长度 递增的次序产生最短路径的算法 一般情况下, Dist[k] = 源点到顶点 k 的弧上的权值 或者 = 源点到其它顶点的路径长度 + 其它顶点到顶点 k 的弧上的权值。 设置辅助数组Dist,其中每个分量Dist[k] 表示 当前所求得的从源点到其余各顶点 k 的最短路径。 1)在所有从源点出发的弧中选取一条权值最小的弧,即为第一条最短路径。 2)修改其它各顶点的Dist[k]值。 假设求得最短路径的顶点为u, 若 Dist[u]+G.arcs[u][k]Dist[k] 则将 Dist[k] 改为 Dist[u]+G.arcs[u][k]。 V0和k之间存在弧 V0和k之间不存在弧 其中的最小值即为最短路径的长度。 void ShortestPath_1(Mgraph G,int v0,PathMatrix *p, ShortPathTable *D) { /*用Dijkstra算法求有向网G的v0顶点到其余顶点v的最短路径P[v]及其路径长度D[v]*/ /*若P[v][w]为TRUE,则w是从v0到 v当前求得最短路径上的顶点*/ /*final[v] 为TRUE当且仅当v∈S, ,即已经求得从v0到v的最短路径*/ /*常量INFINITY为边上权值可能的最大值*/ for (v=0;vG.vexnum;++v) {fianl[v]=FALSE; D[v]=G.arcs[v0][v]; for (w=0; wG.vexnum; ++w) P[v][w]=FALSE;/*设空路径*/ if (D[v]INFINITY) {P[v][v0]=TRUE; P[v][w]=TRUE;} } D[v0]=0; final[v0]=TRUE; /*初始化,v0顶点属于S集*/ /*开始主循环,每次求得v0到某个v 顶点的最短路径,并加v到集*/ for(i=1; iG.vexnum; ++i) /*其余G.vexnum-1个顶点*/ { min=INFINITY; /*min为当前所知离v0顶点的最近距离*/ for (w=0;wG.vexnum;++w) if (!final[w]) /*w顶点在V-S中*/ if (D[w]min) {v=w; min=D[w];} final[v]=TRUE /*离v0顶点最近的v加入S集合*/ for(w=0;wG.vexnum;++w) /*更新当前最短路径*/ if (!final[w](min+G.arcs[v][w]D[w])) /*修改D[w]和P[w],w∈V-S*/ { D[w]=min+G.arcs[v][w]; P[w]=P[v]; P[w][v]=TRUE; /*P[w]=P[v]+P[w]*/ }//if }//for }/*ShortestPath._1*/ 例 算法的时间复杂度 第一个for循环的时间复杂度是O(n), 第二个for循环共进行n-1次, 每次执行的时间是O(n)。 所以总是的时间复杂度是O(n2)。 如果用带权的邻接表作为有向图的存储结构, 则虽然修改D的时间可以减少, 但由于在D向量中选择最小的分量的时间不变, 所以总的时间仍为O(n2)。 每一对顶点之间的最短路径 ? 时间复杂度? O(n3) 弗洛伊德(Floyd)提出的另一个算法。 这个算法的时间复杂度也是O(n3), 但形式上简单些。 求每一对顶点之间的最短路径 弗洛伊德算法的基本思想是: 从 vi 到 vj 的所有可能存在的路径中,选出一条长度最短的路径。 若vi,vj存在,则存在路径{vi,vj} // 路径中不含其它顶点 若vi,v1,v1,vj存在,则存在路径{vi,v1,vj} // 路径中所含顶点序号不大于1 若{vi,…,v2}, {v2,…,vj}存在, 则存在一条路径{vi, …, v2, …vj} // 路径中所含顶点序号不大于2 … 依次类推,则 vi 至 vj 的最短路径应是上述这些路径中,路径长度最小者。 例子 实例:某乡有A、B、C、D四个村庄,如图所示,图中边上的权值表示村庄将的距离。

文档评论(0)

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

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

版权声明书
用户编号:8130065136000003

1亿VIP精品文档

相关文档