最短路径问题是图论研究中的一个经典算法问题,旨在寻找图(由结点和路径组成的)中两结点之间的最短路径。算法具体的形式包括:
确定起点的最短路径问题 - 即已知起始结点,求最短路径的问题。适合使用Dijkstra算法。
确定终点的最短路径问题 - 与确定起点的问题相反,该问题是已知终结结点,求最短路径的问题。在无向图中该问题与确定起点的问题完全等同,在有向图中该问题等同于把所有路径方向反转的确定起点的问题。
确定起点终点的最短路径问题 - 即已知起点和终点,求两结点之间的最短路径。
- 全局最短路径问题 - 求图中所有的最短路径。适合使用Floyd-Warshall算法。
Dijkstra算法
前三种问题使用Dijkstra算法来求解效率都不错。
Dijkstra算法的具体实现方法为:
设置两个顶点的集合T和S:
a) S中存放已找到最短路径的顶点,初始时,集合S中只有一个顶点,即源点v0;
b) T中存放当前还未找到最短路径的顶点;
在T集合中选取当前长度最短的一条最短路径(v0,…,vk),从而将vk加入到顶点集合S中,并修改源点v0到T中各顶点的最短路径长度;重复这一步骤,直到所有的顶点都加入到集合S中,算法就结束了。
时间复杂度:
O(n2)
视频参考: 屈老师的算法视频
Floyd算法
Floyd算法是一种求全局最短路径的一种算法,这个算法采用动态规划的思想,d(k)[i, j]表示i到j之间的路径经过最大的节点数不超过k的最短长度,
递推方程:
d(k)[i,j]=min{d(k−1)[i,j],d(k−1)[i,k]+d(k−1)[k,j]}
最终结果就是
d(n)[i,j]
时间复杂度为
O(n3)