多起点,多终点的最短路径问题

  • 问题背景
  • 蛮力算法
  • 动态规划
    • 求解过程
  • 总结归纳及时间复杂度分析O(mn)O(mn)O(mn)

问题背景

  • 在实例中经常会遇到路径选择问题,n个起点S1,S2,...,SNS_1,S_2,...,S_NS1​,S2​,...,SN​,n个终点T1,T2,...,TNT_1,T_2,...,T_NT1​,T2​,...,TN​,其余结点是途经结点,结点之间用边相连,边上的整数表示长度。
  • 问题:给定道路图,在所有起点到终点的路径中找一条长度最短的路径

蛮力算法

穷举每一个起点到每一个终点的所有可能路径,然后计算每条路径的长度,从中找出最短路径。每条路径对于上述实例,每条路径由4条边组成,除了上下最上,最下两条边的某些结点以外,位于中间的结点有2条边可选。
起点个数m,n为每条路径长度,也就是路网的层数。那么从起点到终点的路径大致达到O(m2n)O(m2^n)O(m2n)量级。

动态规划

求解过程

终点往起点回推,把求解过程分为4步,每一步对应的子问题的终点不变,但起点逐步前移,使得前步已经求解的问题恰好是后面新问题的子问题,到最后一步求解的是最大的子问题,正好是原始问题
具体来说所有子问题的终点都是TmT_mTm​(m=1,2,…,5)。但起点不同

  • 第一步对应子问题的起点是ClC_lCl​(l=1,2,3,4)
  • 第二步对应的子问题的起点是BkB_kBk​(k=1,2,3,4,5)
  • 第三步对应的子问题的起点是AjA_jAj​(j=1,2,3,4)
  • 第四步对应的子问题的起点是SiS_iSi​(i=1,2,3,4,5)。这实际上就是原问题

每一步需要求解的是当前起点到终点最短路径及其长度

注意:计算完之后要标记在图上,便于追踪。

  • 第一步要确定任何ClC_lCl​到终点的最短路径。先看C1,再看C2…
  • 第二步要确定从任何BkB_kBk​到终点的最短路径:F(Bk)=min⁡l{BkCl+F(Cl)}F(B_k)=\displaystyle\min_l\{B_kC_l+F(C_l)\}F(Bk​)=lmin​{Bk​Cl​+F(Cl​)}
  • 类似的完成后两部递推判断:
  • F(Aj)=min⁡k{AjBk+F(Bk)}F(A_j)=\displaystyle\min_k\{A_jB_k+F(B_k)\}F(Aj​)=kmin​{Aj​Bk​+F(Bk​)}
  • F(Si)=min⁡j{SiAj+F(Aj)}F(S_i)=\displaystyle\min_j\{S_iA_j+F(A_j)\}F(Si​)=jmin​{Si​Aj​+F(Aj​)}

每个结点标记的解释u/d代表路径方向,后面的数值代表从这个结点作为出发点到达终点所走的路径的最小值。
u代表从这个位置向up(上)走,d代表从这个位置向down(下)走

总结归纳及时间复杂度分析O(mn)O(mn)O(mn)

与蛮力算法相比,这种算法的好处是:
在判断时只考虑由前面子问题的最优解(是当前子问题最优解的组成部分)可能的延伸结果,从而把许多不可能称为最优解的部分路径今早从搜索中删除,因此能够提高效率。
根据上面的递推公式,除终点外,对每个结点只需要做2次加法(对ClC_lCl​层结点不做加法)和1次比较,因此算法时间复杂度可以降到O(mn)O(mn)O(mn),其中m代表每层的结点个数n是层数

【动态规划】引例--多起点,多终点的最短路径问题相关推荐

  1. 批量处理 | 起点和终点交叉配对进行路线查询

    一.应用场景 在规划通勤路线.物流配送路线.公交线路等工作中,常常需要将一个或多个起点与一个或多个终点进行路线规划,通过比较多组路线结果,优选最佳路线. 小O地图提供了路径查询任务功能,可批量导入坐标 ...

  2. 寻路问题——找到从起点到终点路径

    一,寻路问题介绍 正如组合问题与动态规划的联系之应用提到的从起点(0,0)到终点(X,Y)一共有多少种走法.与之相似的另一个问题是如何找到从(0,0)到(X,Y)的路径? 首先对问题建模.使用一个矩阵 ...

  3. 物流与通勤 | 查找起点和终点交叉匹配多线路方案

    一.应用场景 在规划通勤路线.物流配送路线.公交线路等工作中,常常需要将一个或多个起点与一个或多个终点进行路线规划,通过比较多组路线结果,优选最佳路线. 小O地图提供了路径查询任务功能,可批量导入坐标 ...

  4. 一个人的旅游 hdu2066(多起点多终点 弗洛伊德算法)

    Problem Description 虽然草儿是个路痴(就是在杭电待了一年多,居然还会在校园里迷路的人,汗~),但是草儿仍然很喜欢旅行,因为在旅途中 会遇见很多人(白马王子),很多事,还能丰富自己的 ...

  5. 【小米校招笔试】给定一些线段,线段有起点和终点,求这些线段的覆盖长度,重复的部分只计算一次

    2016年小米校招笔试第一题(西安站) 1 给定一些线段,线段有起点和终点,求这些线段的覆盖长度,重复的部分只计算一次. 参考解法(Java版): package XiaoMi;/********** ...

  6. 获得有向无环图中起点到终点的所有路径_力扣1514——概率最大的路径

    本题主要和图的遍历求解最短路径相关,可以用 Dijkstra 或者 Bellman-Ford 算法进行解决. 原题 给你一个由 n 个节点(下标从 0 开始)组成的无向加权图,该图由一个描述边的列表组 ...

  7. 3D空间的指定起点和终点的抛体运动

    用3D空间坐标,通过矢量运算借助抛体方程和均分原理实现 例子:3D空间的指定起点和终点的抛体运动 这个例子模仿炮弹的发射效果,并且伴有剧烈的爆炸和爆炸后的振动效果. 转载于:https://www.c ...

  8. java 常用流_Java流类图结构: 流的概念和作用流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象。即数据在两设备间的传输称为流,流的本质是数据传输,根据数...

    Java流类图结构: 流的概念和作用 流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象.即数据在两设备间的传输称为流,流的本质是数据传输,根据数据传输特性将流抽象为各种类,方便更直观 ...

  9. [Origin]图像属性:画图时修改直线的起点和终点、随图层和坐标变化、多y轴图独立编辑线条属性

    假设你现在需要在Origin中从一个图像上选两个点,做一条过这两个点的直线l1,再做一条与l1平行且过已知点的直线l2 (图1 工程力学实验-规定非比例伸长应力测定-测回法) ①取点可以使用scree ...

最新文章

  1. RPM包搜索下载网站
  2. 中国充换电行业产销需求预测与转型升级战略分析报告2022-2028年版
  3. FileProvider 在 Android N 上的应用
  4. Machine Learning——octave矩阵操作(2)——DAY3
  5. ECCV 2020 | 微软亚洲研究院精选论文摘录
  6. linq 连接mysql_如何:使用 LINQ 查询数据库 - Visual Basic | Microsoft Docs
  7. IIS6.0相关漏洞复现
  8. 录屏软件电脑版哪个好?4个电脑免费录屏软件推荐
  9. 产品需求分析流程图怎么做?软件我都帮你找了
  10. 软件工程-基本流程图
  11. 谷歌Gmail注册方法
  12. JAVA:18位身份证号码验证工具类(识别性别和生日、计算年龄)
  13. umount卸载磁盘提示target is busy. (目标忙) 的问题解决方案
  14. Kryo 缓冲区溢出
  15. lwIP 细节之三:TCP 回调函数是何时调用的
  16. 儿童的31个“敏感期”特点及建议(转载)
  17. matlab 小波 清浊音,matlab语音信号处理如何判别清浊音?
  18. Riverbed SteelConnect荣获2017 Interop东京展“最佳展示奖”
  19. 搜狗语音云开发入门--移动端轻松添加高大上的语音识别
  20. 使用selenium模拟登录解决滑块验证问题

热门文章

  1. 如何利用SQLyog数据库管理工具生成各表的关系视图
  2. 虚拟机VirtualBox安装windows操作系统(图文教程)
  3. 贪财好色,做个俗人。
  4. CC2640 蓝牙动态切换广播数据
  5. 数据结构与算法 学习笔记(上)
  6. 8月2日Pytorch笔记——梯度、全连接层、GPU加速、Visdom
  7. 程序员:为了提升自己的竞争力!哪些含金量高的证书可以考?
  8. Software_C#_grammer_Deletegate--Strategy
  9. C++STL之map详解
  10. 斗地主 功能测试实战--需求分析,欢乐豆到底怎么输光的