弗洛伊德算法思想理解
最近考研复习到图的一些算法,但书上对这些算法解释只是一笔带过,更多的是如何做,如何使用。对于我这种又笨又固执的人来说,无疑非常难受,甚至一开始想不明白这个地方,但又说不出来,所以昨天很长时间都在思考这个算法是为什么。
看了很多博客,发现也鲜有人去写怎么理解,大都是代码加栗子,接下来说说我从另一个方面的理解,如果有不对的地方,希望大家指正。
首先定义一下图的结构
typedef struct {char vex[MAXVERTEXNUM]; //顶点表int edge[MAXVERTEXNUM][MAXVERTEXNUM]; //邻接矩阵int vexnum; //当前图的顶点数int edgenum; //当前图的边数
}Graph;
弗洛伊德算法的核心代码
for(int k=0; k<g.vexnum; k++) //最外层循环为中间顶点for(int i=0; i<g.vexnum; i++) //i为起点for(int j=0; j<g.vexnum; j++) //j为终点if(dist[i][j] > dist[i][k]+dist[k][j]) {//更新最短路径 若此处还需path矩阵应同步更新dist[i][j] = dist[i][k] + dist[k][j];}
核心代码非常简单,只有短短几行,便可寻找出图中任意两点之间的最短路径,真的非常佩服创造这些算法的前辈
接下来说说自己的一些理解:
- 从核心代码可以看出,每次更新的只是不超过3个点之间的最短路径,即在尝试向两点i,j之间插入第三点k。由此我产生了一个疑问,若两点之间的最短路径长度大于2,弗洛伊德算法是如何寻找到的呢?
- 两点之间的最短路径分为3种情况:无路径,路径长度为1或2(即有一个中间顶点),路径长度大于2(即有多个中间顶点)
- 对于前两种情况可以通过弗洛伊德算法很好的得到,对于第三种情况,例如i和j之间的最短路径为i–>k1–>k2–>…–>km–>j,通过对最短路算法的分析,显然得该路径中任意两点ki,ki+2的最短路径仍属于该路径即ki–>k(i+1)–>k(i+2),反过来说只要找到所有长度小于等于2的最短路径,就可以得到(组合为)任意两点之间的最短路径,因此(1)中的问题就解决了,也可以理解为弗洛伊德算法核心代码遍历的过程,对于比较长的最短路径来说就是不断寻找到中间顶点ki(1<=i<=m)的过程,而且寻找的顺序是无所谓的。
弗洛伊德算法思想理解相关推荐
- matlab温度数据怎么滤波_卡尔曼滤波算法思想理解 Kalman filter 第一篇
卡尔曼滤波算法思想理解 Kalman filter 第一篇 最近在初步的理解目标跟踪的领域, 其中一个非常经典的算法卡尔曼滤波Kalman filter是需要有很好的理解才行, 由于已经脱离了学校,懂 ...
- 算法思想理解系列 -- 检索排序学习之pairwise类型
1 不那么重要的引言 一般地,在推荐系统中,对于召回结果集需要经过排序截取topN露出,那么就需要给每条结果打一个分值,按分值排序. 因此,找到一个合适的打分函数就至关重要,那么排序学习算法的作用就是 ...
- 校园导航系统之用弗洛伊德算法求加权图的最短路径
其实这个示例是在大一数据结构课程设计的时候选的题目,只不过在昨天的算法分析与设计实验课上又看到了求加权图的最短路径,忽然想起当初课程设计时为了弄懂Floyd算法而不断抓狂的过程,觉得有必要将它从邮箱的 ...
- (王道408考研数据结构)第六章图-第四节5:最短路径之弗洛伊德算法(思想、代码、演示、答题规范)
文章目录 一:动态规划基本思想 二:弗洛伊德(Floyd)算法基本思想 三:弗洛伊德(Floyd)算法代码实现 四:弗洛伊德(Floyd)算法代码视频演示 五:弗洛伊德(Floyd)算法代码答题规范 ...
- yolo系列算法思想流程简单讲解概述————(究极简单的讲述和理解)
在我想学习算法的时候,我看某些大佬特别喜欢上来就讲论文,给我搞的贼难受,毕竟本人太辣鸡了,上来这么搞看不懂,经过诸多算法的这样折磨.我打算根据自己的亲身经历和学习过程中遇到的问题出一期, ...
- 关于左对齐和左对齐的一些简单理解和杨辉3角的算法思想
首先我们来谈谈左对齐和右对齐的实际效果,根据定义是比较难理解左对齐和右对齐的实际效果的,当你上手调试了之后会发现是左对齐是对你的数据不满所需的位数时在你的数据左边补上和空格个数,而右对齐是指在你的数据 ...
- 图码详解算法|理解八大思想,胜刷百道力扣!
文章首发:微信搜索「Kevin的学堂」 零.前言 Hello,我是Kevin,之前和大家刷题打卡了很多天,但是发现效果并不理想,于是我在反思,我知道由于我追求数量导致了文章质量不高,另外我只是分享题解 ...
- 动态规划从理论到实践-深入理解贪心/分治/回溯/动态规划的算法思想
摘要:本文主要讲解常见的四种算法,分别为贪心算法:第一步选择最优的走法,算法不能做到全局最优:分治算法:一种处理问题的思想,使用递归来实现:回溯算法:我们枚举所有的解,找到满足期望的解,可以把求解过程 ...
- 算法思想——贪心(详细举例理解~)
算法思想 贪心算法 分而治之(递归思想) 动态规划 暴力穷举 文章目录 引入 基础知识 贪心三步走 举例 例题分享 引入 思考: 假设有四种硬币,面值分别为50元.10元.5元和1元. 现在要找给某顾 ...
最新文章
- icd11中文版精神障碍pdf_精神与行为障碍类别目录(ICD-11)
- java中public private_java中public、private、protected区别
- html在线播放avi视频,Doinb涉嫌踩一捧一?暖心安慰小天,拿kanavi做比较却遭到非议...
- Java多线程学习三十一:ThreadLocal 是用来解决共享资源的多线程访问的问题吗?
- Maven技巧和窍门:高级Reactor选项
- findContours函数参数详解
- AS星尘粒子系统 初识2
- Python使用pyhive库远程操作hive的配置和使用
- 单片机技术与c语言编程教学大纲,《单片机原理及应用》课程教学大纲
- 解决拯救者Y7000打游戏,看视频没有声音的问题
- 2019年linux云计算就业前景,云计算前景与网络前景
- 中国双酚F树脂市场趋势报告、技术动态创新及市场预测
- 三毛经典人生励志语录
- 汪光焘:中国城市交通问题、对策与理论需求
- Ubuntu常用磁盘工具Disks、GParted和系统清理应用Cleaner
- html与word字体大小转换,字体大小不一样,当html转换为Word使用Microsoft.Office.Interop.Word...
- 汇编———标志(flag)寄存器
- 京东2018校园招聘面试题学习
- 你知道Kafka和Redis的各自优缺点吗?一文带你优化选择,不走弯路
- js 数据验证(psv)
热门文章
- bzoj2563阿狸和桃子的游戏
- 家到学校路线图怎么画_PPT绘制家到学校路线图教程
- dbus-1 not met问题
- 构建基于MX1919的超声波阵列驱动板
- MATLAB/Simulink当真,开环Buck、闭环Buck、双闭环Buck仿真;开环控制的半桥LLC谐振变换器,全桥LLC谐振变换器和电压闭环控制的半桥LLC
- 细致的网站开发流程有哪些呢?
- 如何批量调整图片尺寸?
- python 生成诸如A001 A002 ... A100这样的序列
- 微信小程序之一个页面多个转发分享按钮,如何识别不同的按钮
- Building wheel for opencv-python (PEP 517) 卡住