最短路径问题之Floyd算法(C语言)

Posted bfhonor

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了最短路径问题之Floyd算法(C语言)相关的知识,希望对你有一定的参考价值。

一、单源最短路径

(一)Floyd算法(带权图、无权图)

  • Floyd算法:求出每⼀对顶点之间的最短路径
  • 使⽤动态规划思想,将问题的求解分为多个阶段
  • 对于n个顶点的图G,求任意⼀对顶点 Vi —> Vj 之间的最短路径可分为如下⼏个阶段:
    #初始:不允许在其他顶点中转,最短路径是?
    #0:若允许在 V0 中转,最短路径是?
    #1:若允许在 V0、V1 中转,最短路径是?
    #2:若允许在 V0、V1、V2 中转,最短路径是?

    #n-1:若允许在 V0、V1、V2 …… Vn-1 中转,最短路径是?

(二)算法思想

  • #初始:不允许在其他顶点中转,最短路径是?
  • #0:若允许在 V0 中转,最短路径是?——求 A(0) 和 path(0)

  • #1:若允许在 V0V1 中转,最短路径是?——求 A(1) 和 path(1)

  • #2:若允许在 V0、V1V2 中转,最短路径是?——求 A(2) 和 path(2)

  • 从A(-1) 和 path(-1) 开始,经过 n 轮递推,得到 A(n-1) 和 path(n-1)

(三)Floyd算法核心代码

(四)Floyd算法实例

  • #初始:不允许在其他顶点中转,最短路径是?
  • #0:若允许在 V0 中转,最短路径是?——求 A(0) 和 path(0)

  • #1:若允许在 V0V1 中转,最短路径是?——求 A(1) 和 path(1)


  • #2:若允许在 V0、V1V2 中转,最短路径是?——求 A(2) 和 path(2)


  • #3:若允许在 V0、V1、V2V3 中转,最短路径是?——求 A(3) 和 path(3)


  • #4:若允许在 V0、V1、V2、V3V4 中转,最短路径是?——求 A(4) 和 path(4)

  • V0到V4 最短路径长度为 A[0][4]=4

(五)Floyd算法用于负权图

(六)局限性——不能解决的问题

  • Floyd 算法不能解决带有“负权回路”的图(有负权值的边组成回路),这种图有可能没有最短路径

(七)BFS算法 vs Dijkstra算法 vs Floyd算法

  • 注:也可⽤ Dijkstra 算法求所有顶点间的最短路径,重复 |V| 次即可,总的时间复杂度也是O(|V|3)

以上是关于最短路径问题之Floyd算法(C语言)的主要内容,如果未能解决你的问题,请参考以下文章

最短路径之Floyd算法

算法:最短路径之弗洛伊德(Floyd)算法

JS实现最短路径之弗洛伊德(Floyd)算法

a*算法求最短路径和floyd还有dijsktra算法求最短路径的区别?

多源最短路径--Floyd-Warshall算法

(王道408考研数据结构)第六章图-第四节5:最短路径之弗洛伊德算法(思想代码演示答题规范)