泛运筹理论初探——图论Dijkstra和Floyd简介

图论-图论算法之Dijkstra和Floyd

图论经典算法简介之Dijkstra和Floyd
    在上一篇文章里我们介绍了BFS和DFS 的基本思想,这两种算法主要是基于图进行搜索的方法,也是图论发展中最经典的算法。在本次文章里我们将会介绍Dijkstra算法和Floyd算法,这两种算法其实都是最短路径的解决方法,不同的是Dijkstra算法是基于单源点求最短路径的方法,也就是通过确定初始点以后对外进行计算最短路径,而Floyd算法则可以计算任意两点的距离,显然Floyd算法是更为通用的,那么下面我们来介绍这两种算法。
    首先介绍的是Dijkstra算法,该算法的核心是通过不断更新当前点的最短路径来实现的,并且在每一次更新后都会将当前点作为中间点进行探索,如果当前点作为中间点有更短的路径,则更新矩阵里对应的位置参数,否则继续维持当前点距离原始点的最短路径。其算法步骤如下:
    1、初始化原始点A,并且初始化得到该点A到其他所有点的距离的值,如果不相邻,则距离是无穷大。
    2、从与A相邻的最短距离的点B,并将点B加入最终候选路径的集合Z,同时也将点B移除出原始集合。
    3、更新其余点到点A的距离,计算的其实是其余点到B的距离,加上已经确定是B到A的距离,得到新的距离值。
    4、继续步骤3进行更新计算,得到后续的点也是将新的点更新到候选路径里,但是其距离可能会更新成更小的值,因为可能有候选路径里的点C使得Dist(A,C)<Dist(A,B)+Dist(B,C) ,然后继续计算和更新。
    5、重复上述步骤后,直到遍历完所有的点并且得到候选的路径和最短路径结果。
在这里插入图片描述
    然后介绍的是Floyd算法,该算法的核心是通过动态规划的方法实现,每一次在计算距离的时候,不仅要维持原始距离的矩阵,还要维护一个中介状态矩阵,每次计算的时候都会更新这两个矩阵,最终得到的距离矩阵其实就是最短路径的结果,该算法步骤如下:
    1、初始化原始距离矩阵为M,即任意两点的距离是它们直接相连的边的权值,如果不相连则记为正无穷大,初始化中介值的距离为-1,然后开始计算。
    2、将第一个点A拿来计算,如果有A作为中介点使得,任意两个点的距离更短,则更新这个距离值,否则的话不更新。
    3、反复重复步骤2,直到每一个点都遍历完毕后,得到的距离矩阵就可以直接得出任意两点的最短路径。
    总的来说,这两种算法都是比较容易理解的,但在大量真实的场景下一般不会直接使用这两种算法,因为这两种算法对于那些数据量很大的、稀疏的图来说,计算的时间会非常的慢,通常会采用优化数据结构或是并行化等操作进行改进。但对于初学者来说,了解这两种算法是非常有必要的,因为这两种算法对应的思路是贪心方法和动态规划方法,这也是图论中解决问题最常见的两种思路,初学者需要掌握这些基本的思路和方法,方便后续提升自己解决问题的能力。

猜你喜欢

转载自blog.csdn.net/qq_26727101/article/details/112698002