当前位置:   article > 正文

最短路径问题之Floyd算法(C语言)_floyd算法求最短路径问题代码

floyd算法求最短路径问题代码

一、单源最短路径

(一)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)
声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号