最短路径求解算法
路径规划算法是指在一个空间内,寻找点A到点B所经过的路径。本文主要围绕两类路径规划算法问题进行讨论。
- 求一个带权网格中两点之间的最短路径。
- 求一个不带权网格中两点之间路径,网格中包含障碍物但障碍物可以破坏k个( 0 ≤ k )?
1. 求一个带权网格中两点之间的最短路径
这属于动态规划(Dynamic Programming,DP)问题,求解思路如下。针对下表,为了求解(0,0)到(3,4)的最短路径,将问题进行划分,如果确定了点(0,0)到(2,3)、(2,4)和(3,4)之间的最短路径a1,a2,a3,则10+min{a1,a2,a3}就为最终的最短路径(0,0)到(3,4)之间的最短路径,这样将大的问题逐渐缩小可使最终问题求解,求解最短路径的过程就是不但求解点(0,0)到中间节点最短路径的过程。
练习题:: https://blog.csdn.net/o83290102o5/article/details/104224603.
3. 求一个不带权网格中两点之间路径,网格中包含障碍物但障碍物可以破坏k个?
主要用到了广度优先遍历(Breadth First Search,BFS)算法,深度优先遍历(Depth First Search,DFS)和广度优先遍历都能够求得一个点到另外一个点的最短路径,但是思路略有不同。
使用深度优先遍历算法求解最短路径是需要穷举所有路径,然后比较所有路径的代价最终确定最短路径,中间根据最短路径同一个点不会重复访问进行剪枝。
广度优先遍历求解虽然也属于暴力破解,但是在求解过程中存在剪枝操作更多主要体现在:
1.最短路径的同一个点不会重复访问。
2.所有路径都一起找,所有路径每一次都一起向前移动一个单位,最先到达定点的一定是最短路径,其它路径不同在进行查找,这也是BFS在速度上由于DFS的主要原因。
练习: https://leetcode-cn.com/problems/shortest-path-in-a-grid-with-obstacles-elimination/submissions/.
总结
BFS可以看成剪枝后的动态规划算法,第一个问题其实也可以使用BFS进行解决。