关于floyd算法

  1. 算法简介
  2. 实现思想
  3. 核心代码
  4. 后记

一、floyd简介
引自百度百科

在计算机科学中,Floyd-Warshall算法是一种在具有正或负边缘权重(但没有负周期)的加权图中找到最短路径的算法。算法的单个执行将找到所有顶点对之间的最短路径的长度(加权)。 虽然它不返回路径本身的细节,但是可以通过对算法的简单修改来重建路径。 该算法的版本也可用于查找关系R的传递闭包,或(与Schulze投票系统相关)在加权图中所有顶点对之间的最宽路径。

是不是觉得很高深?没错,这段介绍并没有什么多大的用。

换而言之
floyd就是一种求最短路的算法,最基础的算法
优点: 代码简短,易于理解,可用于负边权,可求所有点之间的距离
缺点: 时间复杂度爆炸

实现思想
其实floyd是利用dp的思想实现的,不断寻找中间点求最优解

枚举起始点,中点和终点,利用中点不断对不同的起点终点进行松弛操作,
更新任意两点之间的最优子答案,最后得到最优解

核心代码

for(int k=1;k<=n;k++)//枚举中点
{for(int i=1;i<=n;i++)//枚举起点 {for(int j=1;j<=n;j++)//枚举终点 {if(i!=j&&i!=k&&j!=k) //三点不是相同的点时dis[i][j]=min(dis[i][k]+dis[k][j],dis[i][j]);//利用中点进行松弛操作}}
}

是不是很easy?

当然并不是

你是否发现,或者有疑问,floyd的操作,如何能保证能得到最优解,而不是被埋没在次优解里,
或者说你疑问为什么最外层循环是枚举k,因为这样才能保证这个算法的正确性

还记得开始的介绍的实现思想么
没错,动态规划
我们设dis[k][i][j]dis [ k ] [ i ] [ j ]dis[k][i][j] 表示iii和jjj之间可以通过编号为1…k的节点的最短路径。
那么则dis[k][i][j]可以从dis[k−1][i][j]dis [ k ] [ i ] [ j ] 可以从dis [ k -1 ] [ i ] [ j ]dis[k][i][j]可以从dis[k−1][i][j]转移来,表示iii到jjj不经过kkk这个节点。
也可以从dis[k−1][i][k]+dis[k−1][k][j]dis [ k - 1 ] [ i ] [ k ] + dis [ k - 1 ] [ k ] [ j ]dis[k−1][i][k]+dis[k−1][k][j] 转移过来,表示经过k这个点。
意思即dis[k][i][j]=min(dis[k−1][i][j],dis[k−1][i][k]+dis[k−1][k][j])dis [ k ] [ i ] [ j ] = min ( dis [ k - 1 ] [ i ] [ j ] ,dis [ k - 1 ] [ i ] [ k ] +dis [ k - 1 ] [ k ] [ j ] )dis[k][i][j]=min(dis[k−1][i][j],dis[k−1][i][k]+dis[k−1][k][j])
然后我们能发现我们能dis的第一维k是可以省略的,因为k只和k-1有关(就和背包问题中0/1背包和完全背包的一维优化一个原理)

所以当前的dis[i][j]dis [ i ] [ j ]dis[i][j] 都应该是完成上一层动态规划的,如果k不是在最外层,那么dis[i][j]dis [ i ] [ j ]dis[i][j] 就不是完成上一层动态规划的后的状态,有可能有的点没有经过k-1这个点的松弛。

所以k要放在最外面

floyd虽然是最短路算法中最简单基础的一个,但永远不要小看任何一个算法,每种算法都有着自己的智慧

转载于:https://www.cnblogs.com/stargazer-cyk/p/10366536.html

最短路最基本算法———Floyd算法相关推荐

  1. 03 最短路 dijkstra算法spfa算法floyd算法(附带实例代码) 图论-1

    文章目录 最短路 邻接表的图如下 邻接矩阵如下图 链表实现邻接表实现代码 单源最短路径 Dijkstra 算法 朴素版本 Dijkstra 实现代码 堆优化的dijkstra算法代码实现 Bellma ...

  2. 最短路算法 :Bellman-ford算法 Dijkstra算法 floyd算法 SPFA算法 详解

     本文链接   :http://www.cnblogs.com/Yan-C/p/3916281.html . 在本文中因为邻接表在比赛中不如前向星好写,而且前向星效率并不低所以,本文的代码 存图只 ...

  3. 最短路算法----floyd算法

    目录 1:Floyd算法的介绍 2:Floyd算法的代码展现 3:Floyd算法举例 1:Floyd算法的介绍 Floyd算法是属于最短路算法的一种,它是用来求多源最短路径,换句话来说就是求任意两个点 ...

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

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

  5. 短小精悍的多源最短路径算法—Floyd算法

    前言 在图论中,在寻路最短路径中除了Dijkstra算法以外,还有Floyd算法也是非常经典,然而两种算法还是有区别的,Floyd主要计算多源最短路径. 在单源正权值最短路径,我们会用Dijkstra ...

  6. [链接]最短路径的几种算法[迪杰斯特拉算法][Floyd算法]

    最短路径-Dijkstra算法和Floyd算法 http://www.cnblogs.com/biyeymyhjob/archive/2012/07/31/2615833.html Dijkstra算 ...

  7. 只有5行的算法——Floyd算法

    Floyd算法 Floyd 的特别之处 算法设计 完整代码 相关题目 之前写了一篇Dijkstra算法详解,那是在趣学算法上的,不过却没在其中找到Floyd,现在这篇文章是啊哈算法里的Floyd算法讲 ...

  8. 最短路径:Dijikstra算法/Floyd算法

    目录 1.基础 2.单源最短路径--Dijikstra算法 3.所有顶点间的最短路径--Floyd算法 1.基础 2.单源最短路径--Dijikstra算法 思路 void ShortestPath_ ...

  9. 最短路径算法——迪杰克斯拉算法/floyd算法

    最短路径算法--迪杰克斯拉算法 Dijkstra算法的思想 1.设置两个顶点集S和T,集合S中存放已经找到最短路径的顶点,集合T中存放着当前还未找到最短路径的顶点: 2.初始状态下,集合S中只包含源点 ...

最新文章

  1. linux 判断网线是否插入
  2. Oracle 触发器的使用小结
  3. margin塌陷问题
  4. 定义命令别名(alias)
  5. Spring 系列之(1)Spring-framework 调试环境搭建
  6. 回文数(信息学奥赛一本通-T1309)
  7. linux下mkdir头文件_Linux中mkdir函数与Windows中_mkdir函数的区别
  8. 微信公众平台开发,API接入与推送事件(1)
  9. 卫星通信术语名词备忘记录
  10. ps批量处理--像素大小修改
  11. 小米造车follow苹果路线?智能驾驶能力是个关键问题
  12. 不占用系统资源的休眠linux c,Linux-c系统编程
  13. cesium加载geoserver发布的mvt服务
  14. 列表中循环添加字典出现覆盖现象的问题
  15. 帆软(FineReport)---- 数据决策系统的基本配置
  16. 苹果系统这么没有关闭订阅服务器,iPhone 上没有取消订阅的选项怎么办?
  17. ABAP动态模式(Dynamic Pattern)
  18. 将虚拟机VMware从C盘移动到E盘
  19. 国内外的免费AI作图工具
  20. UVA1589 象棋 + UVA 220 黑白棋

热门文章

  1. C# ASP.NET程序员整合Java门户单点登录PHPwind论坛博客软件集成项目经验总结
  2. 前端菜鸡入职一年后的……
  3. 2、python机器学习基础教程——K近邻算法鸢尾花分类
  4. streamsets rest api 转换 graphql
  5. 【302天】跃迁之路——程序员高效学习方法论探索系列(实验阶段60-2017.12.04)...
  6. Python 基础练习
  7. Swift 结构体和类的最大区别
  8. TortoiseHg使用(hg mercurial repository management)
  9. 如何使用ping命令检查网络故障
  10. 敏捷个人第五次练习:个人使命宣言