最短路径问题 [兼容模式].docxVIP

  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.龚劬 《图论与网络最优化算法》重庆大学出版社 2.张绍民 李淑华 《数据结构教程C语言版》中国电力出版社 主讲:重庆大学 龚 劬 主要内容 引例1:最短运输路线问题 引例2:最廉价航费表的制定 Dijkstra算法 Floyd算法 两个例子的求解 最短路径问题的0-1规划模型 引例1:最短运输路线问题 如图的交通网络,每条弧上的数字代表车辆在该路段行 驶所需的时间,有向边表示单行道,无向边表示可双向 行驶。若有一批货物要从1号顶点运往11号顶点,问运 货车应沿哪条线路行驶,才能最快地到达目的地? 2 8 1 7 7 8 8  3 3 5 4 12 5 6 1 2 10 6 5 11 9 3 7 2 9 9 2 3 引例2:最廉价航费表的制定 某公司在六个城市C1,C2,C3,C4,C5,C6都有分公司, 公司成员经常往来于它们之间,已知从Ci到Cj的直达航 班票价由下述矩阵的第i行,第j列元素给出(∞表示无 直达航班),该公司想算出一张任意两个城市之间的最 廉价路线航费表。 0 50 ∞ 40 25 10 50 0 15 20 ∞ 25 ∞ 15 0 10 20 ∞ 40 20 10 0 10 25 25 ∞ 20 10 0 55 ∞ 10 25 25 55 0 4 引例2:最廉价航费表的制定 建立图的模型:以城市为顶点,当且仅当两个城市之 间有直达航班时就在其对应的顶点之间连有一边,得到 图G=(V,E).其中V={C1,C2,C 3,C4,C5,C6}.边权赋为其端 点城市之间的直达航班票价.问题就归结为求加权图G任 意两条边之间的最短路径.G的带权邻接矩阵为 0 50 ∞ 40 25 10 0 15 20 ∞ 50 25 ∞ 15 0 10 20 ∞ 20 10 0 10 40 25 25 ∞ 20 10 0 55 25 ∞ 25 55 10 0 5 z定义 : 设 P(u,v) G u 到 v , 径上的边权之和称为该路径的权 , w(P) . 从 u 到 v 的路径中权最小者 P*( u,v ) u 到 v .  1  8 7 8  2 7 8  3 3 5 4 12 5 6 1 2 10 6 5 9 3 7 2 9 9 2  6 最短路径算法 2 3 3 5 4 1 8 5 6 1 1 2 1 7 7 9 6 2 5 11 0 Dijkstra算法 8 3 7 9 10 2 使用范围: 9 2 寻求从一固定顶点到其余各点的最短路径; 有向图、无向图和混合图; 权非负. 算法思路: 采用标号作业法,每次迭代产生一个永久标号, 从而生长一颗以v0为根的最短路树,,在这颗树上每 个顶点与根节点之间的路径皆为最短路径.. Dijkstra算法——算法步骤 S: 具有永久标号的顶点集; l(v): v的标记; f(v):v的父顶点,用以确定最短路径; 输入加权图的带权邻接矩阵w=[w(vi,vj)]nxm. 1) 初始化 令l(v0)=0,S=Φ;? v≠v0 ,l(v)=∞; 更新l(v), f(v) 寻找不在S中的顶点u,使l(u)为最小.把u加入到S中, 然后对所有不在S中的顶点v,如l(v)l(u)+w(u,v),则 更新l(v),f(v), 即 l(v)←l(u)+w(u,v),f(v)←u; 重复步骤2), 直到所有顶点都在S中为止. MATLAB程序(Dijkstra算法) function [min,path]=dijkstra(w,start,terminal) n=size(w,1); label(start)=0; f(start)=start; for i=1:n if i~=start min=label(terminal); label(i)=inf; path(1)=terminal; end, end i=1; s(1)=start; u=start; while path(i)~=start while length(s)n path(i+1)=f(path(i)); for i=1:n i=i+1 ; ③ ins=0; end ① for j=1:length(s) path(i)=start; if i==s(j) L=length(path); ins=1; path=path(L:-1:1); end, end if ins==0 v=i; if label(v)(label(u)+w(u,v)) label(v)=(label(u)+w(u,v)); f(v)=u; end, end, end  v1=0; k=inf; for i=1:n ② ins=0; for j=1:length(s) if i==s(j) i

文档评论(0)

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

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

1亿VIP精品文档

相关文档