最短路径问题的原理及画法(带约束条件的最短路问题)

最短路径问题是图论研究中的一个经典算法问题,旨在寻找图(由结点和路径组成的)中两结点之间的最短路径。算法具体的形式包括:

  • 确定起点的最短路径问题 - 即已知起始结点,求最短路径的问题。适合使用Dijkstra算法。

  • 确定终点的最短路径问题 - 与确定起点的问题相反,该问题是已知终结结点,求最短路径的问题。在无向图中该问题与确定起点的问题完全等同,在有向图中该问题等同于把所有路径方向反转的确定起点的问题。

  • 确定起点终点的最短路径问题 - 即已知起点和终点,求两结点之间的最短路径。

  • 全局最短路径问题 - 求图中所有的最短路径。适合使用Floyd-Warshall算法。

用于解决最短路径问题的算法被称做“最短路径算法”,有时被简称作“路径算法”。最常用的路径算法有:

  • Dijkstra算法

  • A*算法

  • Bellman-Ford算法

  • SPFA算法(Bellman-Ford算法的改进版本)

  • Floyd-Warshall算法

  • Johnson算法

  • Bi-Direction BFS算法

带约束条件的最短路问题

以上说明的是基本最短路问题,这里要介绍的是带有约束条件的最短路问题,例如:

  1. 最多走10步

  2. 有必须要经过的点、边

  3. 有不能经过的点、边

解决方法其实只需要一个思路:拆点构图,即点附状态。约束条件有几种可能的组合方式,就有几种状态。例如,最多走5步,有两个必须经过的点,有两个必须经过的边,(先不考虑不能经过),那么状态数就是,6*3*3=54,即每个点有54种状态。

以Dijkstra为例

先来复习下Dijkstra算法,其伪代码如下:

最短路径问题的原理及画法(带约束条件的最短路问题)(1)

考虑上述拆点构图我们需要做什么呢?首先在描述距离的数组d要增加维度,例如d[n][54]。这样,我们的以确定最优路径集合S,未确定最优集合Q,就不能再是单纯的点集,而应该是(点 状态)集。其次在11到14行,以确定最优点优化其他点是,应当根据约束条件计算出被优化点的状态是什么,再去更新该状态的点。同样previous数组也应记录的是,s1状态点p1的前一点是s0状态的点p0

最后,考虑不能经过的点、边,估计你早有思路,就是把该点、边从你的图结构中直接抹去。

OK,到此为止,阐述完毕。

,

免责声明:本文仅代表文章作者的个人观点,与本站无关。其原创性、真实性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容文字的真实性、完整性和原创性本站不作任何保证或承诺,请读者仅作参考,并自行核实相关内容。文章投诉邮箱:anhduc.ph@yahoo.com

    分享
    投诉
    首页