最短路径问题

下图给出了一个地图,地图中每个顶点代表一个城市,两个城市间的连线代表道路,连线上的数值代表道路长度。

现在,我们想从城市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(iS{未访问})

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连通且Dis[i]+map[i,j]<Dis「j」,则说明城市j至城市E的最短路径长度应该比Dis[j]更优。可城市j位于城市i后不可能推出此情况,以至于影响最后的解。那么,我们应该如何划分先后次序呢?

如上图所示,从城市a出发,按照与城市a的路径长度划分阶段。

阶段0包含的出发城市有{a}

阶段1所含的城市有{b1,b2}

阶段2包含的出发城市有{C1,C2,C3,C4}

阶段3包含的出发城市有{D1,D2,D3}

阶段4包含城市{E}

这种划分可以明确每个城市的次序,因为阶段的划分具有如下性质

⑴阶段i的取值只与阶段i+1有关,阶段i+1的取值只对阶段i的取值产生影响:

⑵每个阶段的顺序是确定的,不可以调换任两个阶段的顺序;

我们从阶段4的城市E出发,按照阶段的顺序倒推至阶段0的城市a。在求解的各个阶段,利用了k阶段与k+1阶段之间的如下关系

dis[k][x]=

dis[4][E]=0

k=4,3…,0,其中dis[k][x]指k阶段的城市x。由此得出程序

dis[E]←0;

for k←3 downto 0 do {倒序枚举阶段}

for x取遍k阶段的所有城市do

begin

dis[x]←∞;{初始化最短路径为最大}

for y取遍k+1阶段的所有城市doifdis[y]+map[x,y]

end;{for}

输出dis[a];

这个程序的时间复杂度为W(n2),比回溯法的时间复杂度O(n!)要小得多。

python用动态规划求最短路径_动态规划之最短路径问题详解相关推荐

  1. 求立方根_初一数学立方根考点详解,立足基础,把握题型,学会方法

    初一数学实数部分,平方根和立方根这两部分的知识点比较的基础,但是考试中却是经常会考,并且有很多的"陷阱",也是让学生猝不及防,今天我和同学们继续学习交流立方根的知识点,通过详解考点 ...

  2. python写等腰三角形的性质_杨辉三角—知识点详解 - osc_8cfq8uoa的个人空间 - OSCHINA - 中文开源技术交流社区...

    杨辉三角 杨辉三角(欧洲叫帕斯卡三角)是一个很奇妙的东西,它是我国数学家杨辉在1261年发现的,欧洲的帕斯卡于1654年发现,比我国的巨佬数学家杨辉晚了393年.(在此show一下我的爱国情怀) 铺垫 ...

  3. 数学建模_随机森林分类模型详解Python代码

    数学建模_随机森林分类模型详解Python代码 随机森林需要调整的参数有: (1) 决策树的个数 (2) 特征属性的个数 (3) 递归次数(即决策树的深度)''' from numpy import ...

  4. python 读取图片转换为一维向量_对Python中一维向量和一维向量转置相乘的方法详解...

    对Python中一维向量和一维向量转置相乘的方法详解 在Python中有时会碰到需要一个一维列向量(n*1)与另一个一维列向量(n*1)的转置(1*n)相乘,得到一个n*n的矩阵的情况.但是在pyth ...

  5. Python中下划线 _ 的最全用法详解

    Python中下划线 _ 的最全用法详解 '_'是什么? _在python中可以作为一个标识符,用于定义变量和方法唯一名称.同时它也是Python中的一个软关键字,指在某些特定上下文中保留的关键字.截 ...

  6. python统计csv行数_对Python 多线程统计所有csv文件的行数方法详解

    如下所示: #统计某文件夹下的所有csv文件的行数(多线程) import threading import csv import os class MyThreadLine(threading.Th ...

  7. python2.7除法_对python中的float除法和整除法的实例详解

    从python2.2开始,便有两种除法运算符:"/"."//".两者最大区别在: python2.2前的版本和python2.2以后3.0以前的版本的默认情况下 ...

  8. python中怎么计数_浅谈python中统计计数的几种方法和Counter详解

    1) 使用字典dict() 循环遍历出一个可迭代对象中的元素,如果字典没有该元素,那么就让该元素作为字典的键,并将该键赋值为1,如果存在就将该元素对应的值加1. lists = ['a','a','b ...

  9. python实现单例模式的几种方式_基于Python中单例模式的几种实现方式及优化详解...

    单例模式 单例模式(Singleton Pattern)是一种常用的软件设计模式,该模式的主要目的是确保某一个类只有一个实例存在.当你希望在整个系统中,某个类只能出现一个实例时,单例对象就能派上用场. ...

  10. python如何制作脚本_用python给自己做一款小说阅读器过程详解

    前言 前一段时间书荒的时候,在喜马拉雅APP发现一个主播播讲的小说-大王饶命.听起来感觉很好笑,挺有意思的,但是只有前200张是免费的,后面就要收费.一章两毛钱,本来是想要买一下,发现说的进度比较慢而 ...

最新文章

  1. 笑死,别再黑程序员了好吗? | 每日趣闻
  2. 整理了一些t-sql技巧
  3. java 非静态语句块_静态初始化代码块与非静态初始化代码块之间的区别是什么?...
  4. go函数详解:函数定义、形参、返回值定义规范、函数内存分析、不支持重载、支持可变参数、基本数据类型和数组默认都是值传递的、支持自定义数据类型、函数返回值命名
  5. c语言万能预编译,Objective-C学习笔记
  6. React开发(157):一级直接用getFieldDecorator
  7. Dapper的基本使用
  8. 卖不动了,5G资费套餐再降价,网友:再等等再等等
  9. K-means聚类分析算法(二)
  10. jquery submit ie6下失效的原因分析及解决方法
  11. package.json在Node JS应用程序中的重要性
  12. matlab颜色选取与绘制?(附有颜色全表)
  13. Navicat for MySQ中文破解版(无需激活码)
  14. pc端html转换手机端,一种兼容PC端和手机端WEB界面的实现方法与流程
  15. Qt--探讨.exe程序加密
  16. 小学计算机网络教室简介,陆桥实验小学计算机网络教室配备情况一览表(6页)-原创力文档...
  17. 如何设置通过PMU的gpio来唤醒系统
  18. C语言算一维数组均值和标准差(随机生成数组0~100)
  19. Home Assistant系列 -- 接入手机摄像头做实时监控和人脸识别
  20. 解析八核Cortex-A55+ 24路1080解码能力的AI模组

热门文章

  1. 材料作文-不畏艰辛奋勇前行
  2. 面试技巧 转载 https://www.cnblogs.com/lixiaolun/p/5513328.html
  3. elasticsearch6.8 {“error“:“Content-Type header [application/x-www-form-urlencoded] is not supported“
  4. android 通过usb读取 U盘
  5. Shader cesium中材质
  6. eclipse svn插件
  7. 签到考勤java课设_Java程序设计课程设计学生考勤系统Word版
  8. 无纺布带行业调研报告 - 市场现状分析与发展前景预测
  9. 洗涤标志下载_Popmotion简介:自定义动画洗涤器
  10. cometoj——C1027 [欢乐赛]第003话 收服宝可梦吧!