图的最短路径算法

来源:互联网 发布:qsv转换flv软件 编辑:程序博客网 时间:2024/06/16 00:18

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

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

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

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

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

Dijkstra算法

前三种问题使用Dijkstra算法来求解效率都不错。

Dijkstra算法的具体实现方法为:

  1. 设置两个顶点的集合T和S:

    a) S中存放已找到最短路径的顶点,初始时,集合S中只有一个顶点,即源点v0;

    b) T中存放当前还未找到最短路径的顶点;

  2. 在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(k1)[i,j],d(k1)[i,k]+d(k1)[k,j]}
最终结果就是d(n)[i,j]
时间复杂度为O(n3)

视频示例

原创粉丝点击