首页 PASCAL教学 PASCAL教程 PASCAL练习题 基础知识 常用算法 阶段测试 初赛试题 复赛题库 FP错误代码 留言板
排序算法
选择排序
快速排序
高精度运算
存储方法
加法运算
减法运算
乘法运算
扩大进制数
习题与练习
搜索算法
枚举算法
深度优先搜索
广度优先搜索
8数码问题
n皇后问题
搜索算法习题
枚举法习题
聪明的打字员
量水问题
染色问题
跳马问题
算24点
图论算法
最小生成树算法(Prim算法)
单源最短路径算法(Dijkstra算法)
任意结点最短路径算法(Floyd算法)
求有向带权图的所有环
Bellman-Ford算法
计算图的连通性
计算最佳连通分支
计算拓扑序列
图论算法习题
网络建设问题
最短变换问题
挖地雷
乌托邦城市
乌托邦交通中心
动态规划
最短路径问题
动态规划概念
骑士游历问题
最长递增子序列
合唱队形
石子合并问题
能量项链
0/1背包问题
开心的金明
金明的预算方案
加分二叉树
字串编辑距离
花瓶插花
凸多边形三角划分
快餐店
   

【最短路径问题】
    下图给出了一张地图,地图中每个顶点代表一个城市,两个城市间的连线代表道路,连线上的数值代表道路长度,求从A地到E地的最短路径。

【分析】本题可以利用深度搜索法求解,伪代码如下:
var
  s:未访问的城市集合;
  dist[i,j]:存储任意两个城市间的距离数组; {0表示不连通}
function search(city):integer;  {求城市city到城市E的最短距离}
  begin
    if city=E then search←0;
    else begin
           min:=maxint;
           for i取遍所有城市 do
             if dist[city,i]>0 and (i∈s)
             then begin
                    s←s-[i];
                    j←dist[city,i]+search(i);  {递归调用搜索过程}
                    s←s+[i];
                       if j<min then min←j;
                  end;
            search←min;
     end;
begin
  s←除E外所有城市;
  dist[A,E]←search(A);
end.

【效率评价】采用深度搜索的时间复杂度是W(n!),效率很低。主要的原因就在于重复计算了很多路径值。如果把每次计算得到的最短距离保存下来就可以节省很多时间,于是产生了动态规划的思路。
【动态规划】从城市A出发,按照与城市A的路径长度划分阶段。
    阶段0包含的出发城市有{A}
    阶段1包含的城市有{B1,B2}
    阶段2包含的城市有{C1,C2,C3,D,C4}
    阶段3包含的城市有{D1,D2,D3}
    阶段4包含的城市有{E}
    这种划分的性质如下:
   (1)阶段 i 的取值只与阶段 i+1 有关,阶段 i+1 的取值对阶段 i 的取值产生影响;
   (2)每个阶段的顺序是确定的,不可以调换任两个阶段的顺序。
    从阶段4的城市E出发,按照阶段的顺序倒推至阶段0的城市A,得到如下算法:
   
    map[i,j]←两个城市之间的距离数组
    dist[E]←0;
    for k←3 downto 0 do
      for x 取遍k阶段的所有城市 do
         begin
           dist[x]←∞;
           for y取遍k+1阶段的所有城市 do
              if dist[y]+map[x,y]<dist[x]
                 then dist[x]←dist[y]+map[x,y];
         end;
    输出dist[A];


© 版权所有 桐乡市高级中学计算机组 王建献 2005-
制作与维护:
桐高计算机组 王建献 邮箱:omnislash2000@163.com
建议使用:800*600分辨率,IE5.0以上版本浏览器