动态规划-最短路径问题.pdfVIP

  • 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 连

文档评论(0)

1亿VIP精品文档

相关文档