信息学 图论 最短路径.docVIP

  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文档。上传文档
查看更多
图的最短路径 教学专题 图的最短路径 授课学时 1学时(约50分钟) 教学课型 新授课 授课对象 冬令营A层次 教学内容 和 教学目标 知识点 学习要求 了解 理解 掌握 最短路径问题的描述 √ 无权图最短路径 √ 单源最短路径(边权值非负) √ Dijkstra算法中贪心策略 √ Dijkstra算法优化 √ 任意顶点对间最短路径 √ Floyd算法中动态规划思想 √ 图的传递闭包 √ 教学重点 有权图最短路径 教学难点 Dijkstra算法设计过程(用flash动画模拟突破难点) 教学流程 知识点 时间分配 最短路径问题的引入 2分钟 无权图最短路径 5分钟 单源最短路径(边权值非负) 15分钟 交互讨论:边权值为负时Dijkstra的局限性及改进 5分钟 任意顶点对间最短路径 15分钟 图的传递闭包 5分钟 媒体使用 多媒体课件:动画模拟最短路径求解过程 教学内容及示例 设计意图 目前,互联网上有许多网站可用来查找两个地理之间的通路,例如,Google 地图,Baidu 地图等,这些路径查找系统都是用抽象表示国道或省市间的公路,图中的节点表示城市,图中边表示公路路段,边权值表示城市之间的距离,当然也可以表示从某地出发到达目标的时间。 例如,从苏州到南京的司机最关心的是: (1) 苏州、南京之间存在通路吗? (2) 如果苏州、南京之间有一条以上通路,哪条路最短? 目前,第一个问题我们有解决的办法,采用深度优先搜索或者广度优先搜索遍历图可以达到目的,本节课我们还将讨论其他算法。 第二个问题是本节重点讨论的,虽然我们可以枚举任一条可能路径,然后检查是否为最短,但是几乎需要n!的时间,效率太低,我们需要更有效的。 一、无权图最短路径 例1:如下图,假设C1,C2,C3,C4,C5,C6是六座城市,他们之间的连线表示两城市间有道路相通,如果在每一个城市均需要换乘一次飞机,问从C1到其余各城市最少换乘次数。 图1 六个城市地图 对于图G=(V,E),顶点集合V和边集合E,边Ci,Cj没有赋权值,或者也可以认为权值均为1,Ci,j=1,一条路径C1,C2……上的边数叫做无权路径长度(Unweighted path length)找出从C1出发到其余各点的最短路径。 因为边是没有赋权的,所以只对边的数目感兴趣,如果需要记录实际路径我们可以增加一个变量path来代表路径就可以了。 此时此刻可以说从C1到C1(它本身)的最短路径是长为0的路径,把这个信息做个标记,得到下图: 图2 C1被访问 然后开始寻找所有与C1相连的顶点,它们与C1的距离为1,此时我们可以看到C2、C3与C1仅有“一边之遥”,把它们表示在下图, 图3 C1被访问后对邻居顶点的影响 以此推断,到算法结束,分别如下图所示: 图4 最短路径图 显然这种搜索方式就是大家学过的图的广(宽)度优先搜索(Breadth-first search),该方法按层次处理顶点:距开始点最近的顶点首先被访问到,而最远的点最后被访问。 伪代码如下:用邻接矩阵存储图 // 无权最短路径 // 输入:图的邻接矩阵ga,源点i // 输出:源点i至图其它各点的最短路径path(需逆向追溯路径)和长度dist procedure shortest_unweighted(i:integer); begin dist[i] := 0; 其它dist[]为一个非常大的值代表不可达; path[i] :=0; // 0代表是起点或者访问不到;path记录由哪一点访问它 顶点i 进入队列 Q; while 队列Q 非空 do begin 从队列Q中取出队首元素v; known[v] := true; for j := 1 to n do // 依次访问v的所有可直达顶点 begin if ( not known[j] ) and ( ga[v,j] =1 ) then begin if dist[j] 为非常大的值then dist[j] := dist[v] + 1; path[j] := v; 顶点j 进入队列Q; end; // end of then end ; // end of for end; // end of while end; // end of sh

文档评论(0)

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

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

1亿VIP精品文档

相关文档