这个算法主要要弄懂三个循环的顺序关系。

弗洛伊德(Floyd)算法过程:
1、用D[v][w]记录每一对顶点的最短距离。
2、依次扫描每一个点,并以其为基点再遍历所有每一对顶点D[][]的值,看看是否可用过该基点让这对顶点间的距离更小。

算法理解:

最短距离有三种情况:
1、两点的直达距离最短。(如下图<v,x>)
2、两点间只通过一个中间点而距离最短。(图<v,u>)
3、两点间用通过两各以上的顶点而距离最短。(图<v,w>)
对于第一种情况:在初始化的时候就已经找出来了且以后也不会更改到。
对于第二种情况:弗洛伊德算法的基本操作就是对于每一对顶点,遍历所有其它顶点,看看可否通过这一个顶点让这对顶点距离更短,也就是遍历了图中所有的三角形(算法中对同一个三角形扫描了九次,原则上只用扫描三次即可,但要加入判断,效率更低)。
对于第三种情况:如下图的五边形,可先找一点(比如x,使<v,u>=2),就变成了四边形问题,再找一点(比如y,使<u,w& gt;=2),可变成三角形问题了(v,u,w),也就变成第二种情况了,由此对于n边形也可以一步步转化成四边形三角形问题。(这里面不用担心哪个点要先找哪个点要后找,因为找了任一个点都可以使其变成(n-1)边形的问题)。

结合代码 并参照上图所示 我们来模拟执行下 这样才能加深理解:
第一关键步骤:当k执行到x,i=v,j=u时,计算出v到u的最短路径要通过x,此时v、u联通了。
第二关键步骤:当k执行到u,i=v,j=y,此时计算出v到y的最短路径的最短路径为v到u,再到y(此时v到u的最短路径上一步我们已经计算过来,直接利用上步结果)。
第三关键步骤:当k执行到y时,i=v,j=w,此时计算出最短路径为v到y(此时v到y的最短路径长在第二步我们已经计算出来了),再从y到w。

依次扫描每一点(k),并以该点作为中介点,计算出通过k点的其他任意两点(i,j)的最短距离,这就是floyd算法的精髓!同时也解释了为什么k点这个中介点要放在最外层循环的原因.

对于这个算法,网上有一个证明的版本:

floyd算法是一个经典的动态规划算法。用通俗的语言来描述的话,首先我们的目标是寻找从点i到点j的最短路径。从动态规划的角度看问题,我们需要为这个目标重新做一个诠释(这个诠释正是动态规划最富创造力的精华所在),floyd算法加入了这个概念  Ak(i,j):表示从i到j中途不经过索引比k大的点的最短路径。

这个限制的重要之处在于,它将最短路径的概念做了限制,使得该限制有机会满足迭代关系,这个迭代关系就在于研究:假设Ak(i,j)已知,是否可以借此推导出Ak-1(i,j)。

假设我现在要得到Ak(i,j),而此时Ak(i,j)已知,那么我可以分两种情况来看待问题:1. Ak(i,j)沿途经过点k;2. Ak(i,j)不经过点k。如果经过点k,那么很显然,Ak(i,j) = Ak-1(i,k) + Ak-1(k,j),为什么是Ak-1呢?因为对(i,k)和(k,j),由于k本身就是源点(或者说终点),加上我们求的是Ak(i,j),所以满足不经过比k大的点的条件限制,且已经不会经过点k,故得出了Ak-1这个值。那么遇到第二种情况,Ak(i,j)不经过点k时,由于没有经过点k,所以根据概念,可以得出Ak(i,j)=Ak-1(i,j)。现在,我们确信有且只有这两种情况---不是经过点k,就是不经过点k,没有第三种情况了,条件很完整,那么是选择哪一个呢?很简单,求的是最短路径,当然是哪个最短,求取哪个,故得出式子:

Ak(i,j) = min( Ak-1(i,j), Ak-1(i,k) + Ak-1(k,j) )

现在已经得出了Ak(i,j) = Ak-1(i,k) + Ak-1(k,j) 这个递归式,但显然该递归还没有一个出口,也就是说,必须定义一个初始状态,事实上,这个初始状态取决于索引k是从0开始还是从1开始,上面的代码是C写的,是以0为开始索引,但一般描述算法似乎习惯用1做开始索引,如果是以1为开始索引,那么初始状态值应设置为A0了,A0(i,j)的含义不难理解,即从i到j的边的距离。也就是说,A0(i,j) = cost(i,j) 。由于存在i到j不存在边的情况,也就是说,在这种情况下,cost(i,j)无限大,故A0(i,j) = oo(当i到j无边时)

到这里,已经列出了求取Ak(i,j)的整个算法了,但是,最终的目标是求dist(i,j),即i到j的最短路径,如何把Ak(i,j)转换为dist(i,j)?这个其实很简单,当k=n(n表示索引的个数)的时候,即是说,An(i,j)=dist(i,j)。那是因为当k已经最大时,已经不存在索引比k大的点了,那这时候的An(i,j)其实就已经是i到j的最短路径了。

从floyd算法中不难看出,要设计一个好的动态规划算法,首先需要研究是否能把目标进行重新诠释(这一步是最关键最富创造力的一步),转化为一个可以被分解的子目标,如果可以转化,就要想办法寻找数学等式使目标收敛为子目标,如果这一步可以实现了,还需要研究该递归收敛式的出口,即初始状态是否明确(这一步往往已经简单了)。

转载于:https://www.cnblogs.com/secret114/p/4609936.html

【算法】弗洛伊德(Floyd)算法相关推荐

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

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

  2. 算法其实很简单—弗洛伊德(Floyd)算法

    目录 1.弗洛伊德(Floyd)算法介绍 2.弗洛伊德(Floyd)算法最佳应用-最短路径 3.弗洛伊德(Floyd)算法图解分析 3.1 弗洛伊德算法的步骤: 4.代码实现 1.弗洛伊德(Floyd ...

  3. Java迪杰斯特拉(Dijkstra)算法与弗洛伊德(Floyd)算法

    1.Java迪杰斯特拉(Dijkstra)算法与弗洛伊德(Floyd)算法 1.1 迪杰斯特拉(Dijkstra)算法 1.1.1 迪杰斯特拉(Dijkstra)算法介绍 迪杰斯特拉(Dijkstra ...

  4. 060.弗洛伊德(Floyd)算法的原理以及解决最短路径问题

    1. 弗洛伊德(Floyd)算法的原理 1.1. 基本介绍 1.1.1. 弗洛伊德算法和迪杰斯特拉算法比较 1.2. 算法步骤 1.3. 步骤图解 1.3.1. 第一轮循环 1.3.2. 找出每个点作 ...

  5. Java实现之弗洛伊德(Floyd)算法

    一.问题引入 1.问题引入 1)胜利乡有7个村庄(A,B,C,D,E,F, G) 2)各个村庄的距离用边线表示(权),比如A-B距离5公里3)问:如何计算出各村庄到其它各村庄的最短距离? 二.基本介绍 ...

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

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

  7. 数据结构——最短路径算法之floyd算法

    数据结构--最短路径算法之floyd算法 (一) Flody算法 [前言]:前面的Dijkstra算法用来解决单源最短路径的问题,即:从指定点到图上其他各点的最短路径.那么,如果我们要求图中任意两个结 ...

  8. Dijkstra算法、Floyd算法的区别与联系,并由此谈到greedy和DP

    首先,Dijkstra算法与Floyd算法都是广度优先搜索的算法.都可以用来求单源点到其他所有点的最短路径.那么这两者的原理分别是怎样?彼此又有什么区别呢? 求此有向图中起点1到其他所有点的最短距离 ...

  9. 详解BFS,Dijkstra算法,Floyd算法是如何解决最短路径问题的

    目录 1.BFS算法 2.Dijkstra算法 3.Floyd算法 4.总结 1.BFS算法 G纲是个物流离散中心,经常需要往各个城市运东西,怎么运送距离最近--单源最短路径问题 各个城市之间也学要来 ...

  10. 弗洛伊德(Floyd)算法求解图的最短路径

    弗洛伊德(Froyd)算法用于求解所有顶点到所有顶点的的最短路径.时间复杂度为O(n^3). 正如我们所知道的,Floyd算法用于求最短路径.Floyd算法可以说是Warshall算法的扩展,三个fo ...

最新文章

  1. POJ 1273 Drainage Ditches
  2. java ado_Java进击C#——语法之ADO.NET
  3. 移动端html模板卡片列表效果,移动手机Material Design风格信息卡片UI设计
  4. 事件响应的优先级、stopProgapation禁止下层组件响应
  5. Elasticsearch Java API 的使用—多条件查询
  6. 95-30-050-java.util-LinkedHashMap
  7. python plot函数label_python – Matplotlib Contour Clabel位置
  8. thymeleaf常用语法
  9. L1-019 谁先倒 (15 分)
  10. 论文笔记:《DeblurGAN: Blind Motion Deblurring Using Conditional Adversarial Networks》
  11. 最最超级无敌的冷笑话,能把人噎死
  12. 快照劫持 4种方法教你如何处理百度快照劫持系列问题
  13. UEBA架构设计之路1
  14. 怎么做GIF动画?怎样将图片合成gif动图
  15. 【C语言】动态内存管理 [进阶篇_ 复习专用]
  16. opencvjs 磨皮美颜
  17. Spring Boot项目开发流程
  18. 如何进入机械革命官网 下载驱动
  19. 继蚂蚁金服OceanBase之后,腾讯也祭出了大杀技
  20. 多边形凹凸性的判断、自相交判断

热门文章

  1. 2021年中国工业互联网安全大赛核能行业赛道writeup之日志分析
  2. javascript迭代器_JavaScript迭代器概述
  3. PAT甲级排队问题合集 (持续更新中)
  4. 弄懂“进程”(上):3个组成部分、4个基本特征、4个基本状态
  5. 通过 Keras 构建深度学习模型的步骤
  6. 想转行学软件测试要注意哪些问题
  7. 学python培训到底能干嘛
  8. java实现线性表的顺序存储
  9. unity项目警告之 LF CRLF问题
  10. 一个free异常引发的异常