- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 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)