算法简介

FloydFloydFloyd算法是多源最短路径算法,即可以求任意两点的最短路径,它基于动态规划的思想,时间复杂度为O(n3)O(n^3)O(n3)。
它的创始人罗伯特·弗洛伊德(RobertW.Floyd)(Robert\ W.Floyd)(Robert W.Floyd)将此算法命名为Floyd−WarshallFloyd-WarshallFloyd−Warshall算法,简称FloydFloydFloyd算法。罗伯特·弗洛伊德是1978年图灵奖得主,他同时还创立了堆排序算法。

算法思想

FloydFloydFloyd算法的核心思想就是用每个点作为中间结点去更新任意点的最短路径。

它的核心思想是dp[k][i][j]=min(dp[k−1][i][j],dp[k−1][i][k]+dp[i−1][k][j])dp[k][i][j]=min(dp[k-1][i][j],dp[k-1][i][k]+dp[i-1][k][j])dp[k][i][j]=min(dp[k−1][i][j],dp[k−1][i][k]+dp[i−1][k][j])

其中dp[0][i][j]=map[i][j]dp[0][i][j]=map[i][j]dp[0][i][j]=map[i][j]也就是初值为邻接矩阵。

核心代码

假设目前map[0][][]map[0][\ ][\ ]map[0][ ][ ]存的是邻接矩阵。

void Floyd(){for(int k=1;k<=n;k++){for(int i=1;i<=n;i++){for(int j=1;j<=n;j++){map[k][i][j]=min(map[k-1][i][j],map[k-1][i][k]+map[k-1][k][j]);}}}
}

值得注意的是kkk在最外层,这是因为FloydFloydFloyd本质是动态规划算法,做的实际上是二维动态规划。第一个维度的kkk只表示第kkk次动态规划的结果,而第二个第三个维度的kkk则表示以第kkk个点作为中间结点。

优化

FloydFloydFloyd算法可以在空间上进行优化,这才是平常使用的FloydFloydFloyd算法。
dp[k][i][j]=min(dp[k−1][i][j],dp[k−1][i][k]+dp[i−1][k][j])dp[k][i][j]=min(dp[k-1][i][j],dp[k-1][i][k]+dp[i-1][k][j])dp[k][i][j]=min(dp[k−1][i][j],dp[k−1][i][k]+dp[i−1][k][j])中,在第kkk轮时,与kkk相关的路径长度是不会改变的,所以无需保存前一个状态。

void Floyd(){for(int k=1;k<=n;k++){for(int i=1;i<=n;i++){for(int j=1;j<=n;j++){map[i][j]=min(map[i][j],map[i][k]+map[k][j]);}}}
}

总结

FloydFloydFloyd算法的因为要求任意两点最短路径,所以空间复杂度就是存图的O(n2)O(n^2)O(n2),因为三重循环则导致了时间复杂度为O(n3)O(n^3)O(n3)。FloydFloydFloyd算法适用于带负权的图,但不能出现负权环。因此,FloydFloydFloyd算法不适用于大量数据的计算,他简单易实现的同时也注定了效率上得做取舍。

【C++】Floyd算法相关推荐

  1. 数据结构与算法(7-4)最短路径(迪杰斯特拉(Dijkstra)算法、弗洛伊德(Floyd)算法)

    目录 一.最短路径概念 二.迪杰斯特拉(Dijkstra)算法(单源最短路径) 1.原理 2.过程 3.代码 三.弗洛伊德(Floyd)算法(多源最短路径) 1.原理 2.存储 3.遍历 4.代码 参 ...

  2. 【POJ/算法】 3259 Wormholes(Bellman-Ford算法, SPFA ,FLoyd算法)

    Bellman-Ford算法 Bellman-Ford算法的优点是可以发现负圈,缺点是时间复杂度比Dijkstra算法高.而SPFA算法是使用队列优化的Bellman-Ford版本,其在时间复杂度和编 ...

  3. 最小环算法求解(Dijkstra算法+Floyd算法)

    方法一: #include<iostream> #include<algorithm> #include<cmath> #include<cstdio> ...

  4. HDU2544(Bellman-ford算法和Floyd算法)

    思路: 1.初始化时将起点 s 到各个顶点 v 的距离 dist(s->v) 赋值为 ∞,dist(s->s) 赋值为 0: 2.后续进⾏最多 n-1 次遍历操作 (n 为顶点个数), 对 ...

  5. 【图论专题】Floyd算法及其扩展应用

    Floyd的拓展应用: 任意两点最短路 传递闭包 找最小环 恰好经过k条边的最短路(倍增) 题目列表: 题目 算法 AcWing 1125. 牛的旅行 任意两点最短路Floyd AcWing 343. ...

  6. 【图论】用一道题从本质上讲清楚Floyd算法

    P1119 [灾后重建] 4 5 1 2 3 4 0 2 1 2 3 1 3 1 2 2 1 4 0 3 5 4 2 0 2 0 1 2 0 1 3 0 1 4 -1 -1 5 4 一道非常好的Flo ...

  7. 图的单源最短路径,Floyd算法(数据结构c++)

    这个算法结构很是简单,但是理解还是有一定的困难,一开始做的时候想不明白,跟着算法自己动手画画就知道这个算法具体是怎么回事了. 时间复杂度是O(N*3) 算法有点动态规划的意思,有两个数组,一个(dis ...

  8. floyd算法_最短路径的算法:Floyd算法

    点击箭头处"蓝色字",关注我们哦!! 算法 最短路径的算法-Floyd算法 ● ○ ● Shortest Path Algorithm - Floyd Algorithm ● ○ ...

  9. 最短路径—Dijkstra算法和Floyd算法

    Dijkstra算法 1.定义概览 Dijkstra(迪杰斯特拉)算法是典型的单源最短路径算法,用于计算一个节点到其他所有节点的最短路径.主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止.Di ...

  10. 最短路径-Dijkstra算法与Floyd算法

    最短路径-Dijkstra算法与Floyd算法 原文:https://www.cnblogs.com/smile233/p/8303673.html 一.最短路径 ①在非网图中,最短路径是指两顶点之间 ...

最新文章

  1. 结构型模式 -- 代理模式(静态代理动态代理)
  2. Ubuntu 16.04设置IP、网关、DNS
  3. java构造函数_JAVA的构造函数是怎么写的。万分感谢。路过的请不要嘲笑%_%
  4. 谈谈JVM内部锁升级过程
  5. 瑞幸咖啡首席技术官也离职了:并未参加公司财务造假
  6. hibernate mysql 注解_【译】Spring 4 + Hibernate 4 + Mysql + Maven集成例子(注解 + XML)
  7. python索引例子_谈谈python中的索引
  8. 1分钟教你搞定apk签名!!!
  9. 服务器上的微信转账记录能删除吗,微信如何彻底删除转账记录?微信删除转账记录方法...
  10. 必看的经典金融书籍推荐zz
  11. 19c(19.3) 单机数据库静默安装
  12. 用计算机算出身高,身高预测公式计算器靠谱吗
  13. python3 结束进程
  14. Excel如何实现两个工作表数据的对比
  15. 编译原理——非确定有限自动机(三)
  16. onMeasure实例分析
  17. 虽然我不是做游戏的,闲的没事,emm,写了个扫雷小游戏(Android)
  18. C#调用TSC条码打印机打印二维码
  19. 2023开放原子校源行(北京站)成功举办,启航开源新生力量培养
  20. linux gui开发工具2017,linux – 快速开发GUI命令行

热门文章

  1. Exploring Simple Siamese Representation Learning论文笔记
  2. Linux下部署kettle
  3. python等值面追踪_等值线的追踪算法(1)
  4. 微信小程序页面事件 - 下拉刷新与上拉触底
  5. 编程范式(斯坦福大学)学习笔记《二》
  6. Linux中查看redis版本
  7. Typecho CommentToMail邮件插件模板美化
  8. OC 基础 UICollectionView
  9. 程序设计 PTA 7-4 进步排行榜
  10. 大数据有哪些工作?岗位技能要求汇总