[最短路径弗洛伊德算法]三层循环顺序问题
[最短路径弗洛伊德算法](三层循环顺序问题)
先上代码
for(int i=0;i<city;i++)for(int j=0;j<city;j++)for(int k=0;k<city;k++) {if(length[j][i]+length[i][k]<length[j][k])length[j][k]=length[j][i]+length[i][k]; }
众所周知,弗洛伊德是一个利用三层循环来暴力枚举所有可能情况的算法。且其关键是中间结点一定要放在最外层循环。
那么,问题来了:为什么中间结点要放在最外面呢?,有人甚至一度认为放在其他位置也是对的(我)。。。(是不是也有你)。。。
我在网上搜了一下,感觉说的不是很清楚。经过自己的理解后,希望能把这个问题说清楚一点吧,也希望可以帮助大家更好地理解这个算法。
我们知道,最短路径是靠邻接矩阵说话的,那么,请跟着我一起想一想分别把中间结点放在第一层,第二层,第三层时,邻接矩阵是如何随着循环而变化的。
放在第一层:
以我的代码为例,邻接矩阵是length。
此时length是一行一行逐行更新的,所有行更新完后,更换中间结点然后重新从第一行开始逐行更新。更换到最后一个结点时,所有length[j][k]还有一次更新的机会,而且此次更新利用了之前所有更新过的数据。
放在第二层:
length也是逐行更新,但是是先利用初始未更新过的数据去更新第一行若干遍,再去更新第二行若干遍。。。更新到最后一行就结束了。我们可以想到,除了在更新最后一行时,更新时用的数据都不一定是最短路径。就是说,**利用的是为更新完全的数据。**并且最重要的是,之后就没有了再次更新的机会。通俗地说,你用初始数据更新完第一行之后就不管它了。这样说大家应该就能理解了。
放在第三层:
length是利用未更新全面的数据单个更新若干次,之后就没有了再次更新的机会,与放在第二层类似,在下就不过多赘述了。
至此,大家应该能明白为什么中间结点变量要放在循环的最外层了吧。
如果本文能够帮助到你,我非常荣幸。点个赞让我开心一下不过分吧。
欢迎留个评论大家一起讨论。
[最短路径弗洛伊德算法]三层循环顺序问题相关推荐
- 求最短路径 —— 弗洛伊德算法
弗洛伊德算法是求图中任意一对顶点间的最短路径的算法. 算法思想 递推产生一个n解方阵序列,,. . . ,,. . . , 其中[ i ][ j ]表示从顶点到顶点的路径长度,k表示绕行第k个顶点的运 ...
- 最短路径-弗洛伊德算法的java实现
弗洛伊德算法介绍 和Dijkstra算法一样,弗洛伊德(Floyd)算法也是一种用于寻找给定的加权图中顶点间最短路径的算法.该算法名称以创始人之一.1978年图灵奖获得者.斯坦福大学计算机科学系教授罗 ...
- 最短路径之弗洛伊德算法
[1]为什么需要弗洛伊德算法? 带权图中单个源点到所有顶点的最短路径问题可以用<迪杰斯特拉算法>求解. 那如果要求图中每一个顶点与其它顶点之间的最短路径呢?类似可以想到的方法为: 每次以一 ...
- (王道408考研数据结构)第六章图-第四节5:最短路径之弗洛伊德算法(思想、代码、演示、答题规范)
文章目录 一:动态规划基本思想 二:弗洛伊德(Floyd)算法基本思想 三:弗洛伊德(Floyd)算法代码实现 四:弗洛伊德(Floyd)算法代码视频演示 五:弗洛伊德(Floyd)算法代码答题规范 ...
- 【算法】弗洛伊德算法 最短路径算法
文章目录 1.概述 2.图解 2.1 图示 2.2 弗洛伊德算法的步骤: 3.代码 1.概述 弗洛伊德(Floyd)算法介绍 和Dijkstra算法一 样,弗洛伊德(Floyd)算法也是一种用 于寻找 ...
- 图解最短路径之弗洛伊德算法(Java实现)
概述 Floyd算法又称为插点法,是一种利用动态规划的思想寻找给定的加权图中多源点之间最短路径的算法,与Dijkstra算法类似.该算法是一种在具有正或负边缘权重(但没有负环)的加权图中找到最短路径的 ...
- 最短路径(弗洛伊德算法)
1 原理 ,假设存在一个最简单的连通图 2 代码 package leaning.graph;/** * 弗洛伊德算法求最短路径* * */ public class Floyd {// 表示V0顶点 ...
- 两点之间最短路径:弗洛伊德算法
弗洛伊德算法是计算无向有权图中两点间最短路径的算法,复杂度为O(n^3).其思路是将两点间距离分为过(指定的)第三点或是不过,然后取它们的最小值,如此循环就可以得到两点之间真正的最小值. void f ...
- 校园导航系统之用弗洛伊德算法求加权图的最短路径
其实这个示例是在大一数据结构课程设计的时候选的题目,只不过在昨天的算法分析与设计实验课上又看到了求加权图的最短路径,忽然想起当初课程设计时为了弄懂Floyd算法而不断抓狂的过程,觉得有必要将它从邮箱的 ...
最新文章
- AI对人类社会的真正威胁
- python读取excelsheet-python读取excel文件中所有sheet表格
- DataTable的AcceptChange方法为什么不能在Update之前?
- python存储问题_python学习永久存储和异常处理
- 搞怪菜鸟加入域全程图解[为企业部署Windows Server 2008系列十二]
- 利用DBMS_FILE_TRANSFER传输数据库文件
- sklearn自学指南(part14)--Logistic回归
- DevOps案例研究:庖丁解牛,剖析Google持续交付之道
- VirtualBox安装完Linux却进不了系统
- 【渝粤教育】国家开放大学2018年秋季 0529-21T高级英语阅读(1) 参考试题
- 再议 封装、继承、多态
- 安装net framework2.0,装不上怎么办?
- mac/macbook teamviewer 使用 trackpad 触控板双指滑动出问题/出bug/无法控制/无法滚动/速度过快
- 89c51 单片机 c语言 编写sszymmh 歌曲 文档,Proteus仿真51单片机生日快乐音乐播放器...
- echarts 自定义鼠标划过的显示 与 自定义legend
- git 强制拉取最新代码
- 华为HCNA之IPv6实验
- 派工单系统 源码_青鸟报修云酒店设备报修管理系统
- 了解海外域名市场,把域名卖到全世界!
- 这届世界杯真是谁预测谁尴尬,他却要来一次现场直播预测……