图论最短路径之Floyd算法

╰半夏微凉° 2023-03-01 11:47 153阅读 0赞

Floyd算法主要思想

我们在求任意两点间的最短路径时,可以循环一遍所有点,轮流作为源点,然后用dijkstra或bellman算法求解,时间复杂度是O(n3),也可直接使用Floyd算法,更直接,时间复杂度也为O(n3)。

Floyd的代码很简单,其核心代码只有5行:

  1. for(int k = 1;k <= n;k++) //循环1-n所有顶点
  2. for(int j = 1;j <= n;j++) //循环终点
  3. for(int i = 1;i <= n;i++) //循环起点
  4. if(e[i][j] > e[i][k] + e[k][j])
  5. e[i][j] = e[i][k] + e[k][j];

最外层我们循环n个顶点,判断借助该点是否能更近的从i点到j点,i和j我们依次循环所有顶点。这样我们就可以分布依次借助第1个点、第1和2个点、第1和2和3…个点中转,直到最后借助所有点中转,就会得到最短距离。

Floyd算法分析

很明显Floyd算法的时间复杂度是O(n3),Floyd算法适用于有负权值的边的图,但不适用于有负权值回路(存在一条回路其总权值和为负)的图,很明显如果有负权值回路的话一直走该回路,花费就会达到无限小,无法到达终点。

发表评论

表情:
评论列表 (有 0 条评论,153人围观)

还没有评论,来说两句吧...

相关阅读

    相关 路径Floyd算法

    Floyd算法: 1,从任意一条单边路径开始。所有两点之间的距离是边的权,如果两点之间没有边相连,则权为无穷大。 2,对于每一对顶点 u 和 v,看看是否存在一个顶点 w

    相关 Floyd算法

    Floyd算法     时间复杂度O (n^3)   空间复杂度O (n^2) 用处   可以求任意两个点之间的最短路径长度。   得出的邻接矩阵存储 i 到 j 的