最短路径问题的原理及画法(带约束条件的最短路问题)
最短路径问题是图论研究中的一个经典算法问题,旨在寻找图(由结点和路径组成的)中两结点之间的最短路径。算法具体的形式包括:
-
确定起点的最短路径问题 - 即已知起始结点,求最短路径的问题。适合使用Dijkstra算法。
-
确定终点的最短路径问题 - 与确定起点的问题相反,该问题是已知终结结点,求最短路径的问题。在无向图中该问题与确定起点的问题完全等同,在有向图中该问题等同于把所有路径方向反转的确定起点的问题。
-
确定起点终点的最短路径问题 - 即已知起点和终点,求两结点之间的最短路径。
-
全局最短路径问题 - 求图中所有的最短路径。适合使用Floyd-Warshall算法。
用于解决最短路径问题的算法被称做“最短路径算法”,有时被简称作“路径算法”。最常用的路径算法有:
-
Dijkstra算法
-
A*算法
-
Bellman-Ford算法
-
SPFA算法(Bellman-Ford算法的改进版本)
-
Floyd-Warshall算法
-
Johnson算法
-
Bi-Direction BFS算法
以上说明的是基本最短路问题,这里要介绍的是带有约束条件的最短路问题,例如:
-
最多走10步
-
有必须要经过的点、边
-
有不能经过的点、边
解决方法其实只需要一个思路:拆点构图,即点附状态。约束条件有几种可能的组合方式,就有几种状态。例如,最多走5步,有两个必须经过的点,有两个必须经过的边,(先不考虑不能经过),那么状态数就是,6*3*3=54,即每个点有54种状态。
以Dijkstra为例先来复习下Dijkstra算法,其伪代码如下:
考虑上述拆点构图我们需要做什么呢?首先在描述距离的数组d要增加维度,例如d[n][54]。这样,我们的以确定最优路径集合S,未确定最优集合Q,就不能再是单纯的点集,而应该是(点 状态)集。其次在11到14行,以确定最优点优化其他点是,应当根据约束条件计算出被优化点的状态是什么,再去更新该状态的点。同样previous数组也应记录的是,s1状态点p1的前一点是s0状态的点p0。
最后,考虑不能经过的点、边,估计你早有思路,就是把该点、边从你的图结构中直接抹去。
OK,到此为止,阐述完毕。
,免责声明:本文仅代表文章作者的个人观点,与本站无关。其原创性、真实性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容文字的真实性、完整性和原创性本站不作任何保证或承诺,请读者仅作参考,并自行核实相关内容。文章投诉邮箱:anhduc.ph@yahoo.com