- 5
- 0
- 约4.23千字
- 约 4页
- 2021-01-28 发布于湖北
- 举报
最短路径问题
下图给出了一个地图, 地图中每个顶点代表一个城市, 两个城市间的连线代表道路, 连
线上的数值代表道路长度。
现在,我们想从城市 a到达城市 E。怎样走才能使得路径最短,最短路径的长度是多少?设
DiS [x ]为城市 x到城市 E的最短路径长度 (x 表示任意一个城市);
map[i ,j] 表示 i ,j 两个城市间的距离 ,若 map[i ,j]= 0,则两个城市不通;
我们可以使用 回溯法 来计算 DiS [x ]:
var
S:未访问的城市集合 ;
function search(who {x} ) :integer ; { 求城市 who与城市 E的最短距离 }
begin
if Who =E Then Search ←0 { 找到目标城市 }
Else begin
min ← maxint ; { 初始化最短路径为最大 }
for i 取遍所有城市 Do
if (map[Who, i] >0{ 有路 } )and (i S{ 未访问 } )
then begin
S← S-[i] ; { 置访问标志 }
j ← map[Who,i]+ search(i) ; { 累加城市 E至城市 Who的路径长度 }
S← S+[i] ; { 回溯后,恢复城市 i 未访问状态 }
if j <min Then min ←j ; { 如果最短则记下 }
end;{then}
search ← min; { 返回最短路径长度 }
End;{else}
End;{search}
begin
S←除 E外的所有城市;
Dis[a] ←search (a); { 计算最短路径长度 }
输出 Dis[a] ;
end .{main}
这个程序的效率如何呢?我们可以看到,每次除了已经访问过的城市外,其他城市都
要访问,所以时间复杂度为 O (n!),这是一个“指数级”的算法。那么,还有没有效率更
高的解题方法呢?
首先,我们来观察上述算法。在求 b1到 E的最短路径的时候,先求出从 C2到 E的最短路
径;而在求从 b2刭 E的最短路径的时候,又求了一遍从 C2刭 E的最短路径。也就是说,从 C2
到E的最短路径求了两遍。同样可以发现,在求从 Cl 、C2刭 E的最短路径的过程中,从 Dl 到 E
的最短路径也被求了两遍。而在整个程序中,从 Dl 到 E的最短路径被求了四遍,这是多么大
的一个浪费啊!如果在求解的过程中,同时将求得的最短路径的距离 “记录在案” ,以便将
来随时调用,则可以避免这种重复计算。至此,一个新的思路产生了,即
由后往前依次推出每个 Dis 值,直到推出 Dis 「a 」为止。
问题是,究竟什么是“由后往前”呢?所谓前后关系是指对于任意一对城市 i 和j 来说,
如果满足“或者城市 i 和城市 j 不连通或者 dis[i]+map[i ,j] ≥dis[j] ”的条件, 则定义为城
市i 在前、城市 j 在后。因为如果城市 i 和城市 j 连
您可能关注的文档
最近下载
- 2024年潍坊护理职业学院高职单招(英语/数学/语文)笔试2018-2023历年真题摘选带答案解析.docx VIP
- 《智能管理系统创新与发展》课件.ppt VIP
- 仁爱版七年级下册英语单词默写表(中文版).pdf VIP
- 2025年潍坊护理职业学院单招笔试数学试题库含答案解析.docx VIP
- 2025郑州中考一模化学试卷.docx VIP
- 2025河北单招第七类综合素质真题 .pdf VIP
- 2025黑龙江林业职业技术学院单招《数学》经典例题含答案详解(能力提升).docx VIP
- 大病低保申请书.docx VIP
- 发热伴血小板减少综合征药物治疗指南(2025年版)解读PPT课件.pptx VIP
- 2020泰和安TG3100广播控制盘安装使用说明书.pdf VIP
原创力文档

文档评论(0)