Floyd求解最短路
Floyd算法适用于求解全源最短路、也就是能够求解任意两点间的最短路径并且是适用于含有负权边的图,但是含有负环则不行了!空间复杂度为O(n2)、时间复杂度为O(n3)。其具体的原理在百度能够找到很多,下面只说说我的理解,首先关键代码如下
///dp[i][j]表示从 i 点到 j 点的最短路径长度 ///dp的值一开始就是储存原始图的邻接矩阵,将矩阵中没有连通的两点赋值为 INF ; k<=N; k++)///N代表N个顶点 ; i<=N; i++) ; j<=N; j++) dp[i][j] = min(dp[i][j], dp[i][k]+dp[k][j]); ///最后dp中就存储了所有点间的最短距离
即枚举所有的点去作为中转点去松弛 i 和 j ,那考虑这样的一些问题
① 如果将最外层的 k 放在最内层,算法是否依旧正确?
答案是否定的,这里给出知乎上大佬们的回答作为参考==> Floyd算法为什么把k放在最外层?
简单点说就是如果 k 放在内层,那么有些 i、j 便被过早确定、而后面便不再进行松弛更新,来看一
个例子 共有四个节点 ,邻接矩阵如下
inf inf inf 1
inf inf inf inf
inf 1 inf inf
inf 3 1 inf
如果我们按k循环再最内层来计算,
那么1,2节点的最短路径为
min( dp[1][2], dp[1][3]+dp[3][1], dp[1][4]+dp[4][2]) = 4;
而且之后不再更新1,2节点的最短距, 过早确定!
然而实际上min( dp[1][2] ) = dp[1][4]+dp[4][3]+dp[3][2] = 3;
② 那么最外层的 k 的枚举顺序是否有影响?也就是我将 k 逆序枚举 或 k 打乱顺序枚举是否可行?
实际上不影响,对于枚举出来的每一个 k 而言,它需要依赖其他 k 吗?即 当前 k 需要 k-1 或 k+1或者其他一些值先算出来,才能保证当前 k 算出来的是最优的吗?不影响吧!实际上对于一副图来说,并没有什么点的顺序可言,在 Floyd 中 k 的顺序是输入顺序而已,打乱去枚举也没关系!
③ 它为什么是一个动态规划?不应该是贪心枚举全部所有点去贪心松弛么?
对的!它是每一次利用一个中转点去贪心松弛任意两点,每一次枚举完每一个 k 矩阵都应该会有一些点被刷新、变得更小,而每一次松弛都利用了上一次的最优结果,使得不用再重复计算。比如 当前枚举到 k-1 这个阶段,松弛完之后假设 dp[ii][jj] 变得更优了!而因为 dp[ii][jj] 更优了,下一次 k 的枚举就很有可能利用到被更新过的 dp[ii][jj] 去松弛其他点,避免了子问题重复计算,矩阵保存的就是当前这些最优 dp 状态,有动态规划的特点。上面的解释也能去解释 ② 。这只是我的个人感觉,若能指出其中错误,感激不尽!
第 ② 点的验证、以 HDU 2544
打乱顺序没问题、AC 逆序也没问题、AC
Floyd求解最短路的更多相关文章
- 关于Floyd求解最小环的问题
最近学习了floyd的奇妙用处,求解最小环,自己的领悟写在了纸上. 对于一个最小环,显然至少要包含三个点(此处不把两个点的回路称之为环) 从大体上考虑的话,一定有一个点与左右两侧的点是直接连接的(即不 ...
- 关于SPFA Bellman-Ford Dijkstra Floyd BFS最短路的共同点与区别
关于模板什么的还有算法的具体介绍 戳我 这里我们只做所有最短路的具体分析. 那么同是求解最短路,这些算法到底有什么区别和联系: 对于BFS来说,他没有松弛操作,他的理论思想是从每一点做树形便利,那么时 ...
- UESTC 30 &&HDU 2544最短路【Floyd求解裸题】
最短路 Time Limit: 5000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submiss ...
- Floyd 求最短路(poj 1161)
Floyd-Warshall算法介绍: Floyd-Warshall算法的原理是动态规划. 设为从到的只以集合中的节点为中间节点的最短路径的长度. 若最短路径经过点k,则: 若最短路径不经过点k,则. ...
- dijkstra,SPFA,Floyd求最短路
Dijkstra: 裸的算法,O(n^2),使用邻接矩阵: 算法思想: 定义两个集合,一开始集合1只有一个源点,集合2有剩下的点. STEP1:在集合2中找一个到源点距离最近的顶点k:min{d[k] ...
- [JSOI2007]重要的城市 floyd:最短路计数
---题面--- 题解: 其实感觉还是比较妙的,第一眼看题想到floyd统计最短路条数, 注意到对于任意两点x,y而言,floyd将会枚举其最短路所可能经过的所有中转点, 因此我们可以直接分别统计对于 ...
- Bellman-ford算法、SPFA算法求解最短路模板
Bellman-ford 算法适用于含有负权边的最短路求解,复杂度是O( VE ),其原理是依次对每条边进行松弛操作,重复这个操作E-1次后则一定得到最短路,如果还能继续松弛,则有负环.这是因为最长的 ...
- HDU 4034 Graph(floyd,最短路,简单)
题目 一道简单的倒着的floyd. 具体可看代码,代码可简化,你有兴趣可以简化一下,就是把那个Dijsktra所实现的功能放到倒着的floyd里面去. #include<stdio.h> ...
- Minimum Transport Cost Floyd 输出最短路
These are N cities in Spring country. Between each pair of cities there may be one transportation tr ...
随机推荐
- 初学node.js-nodejs中实现用户登录路由
经过前面几次的学习,已经可以做下小功能,今天要实现的事用户登录路由. 一.users_model.js 功能:定义用户对象模型 var mongoose=require('mongoose'), S ...
- seaborn用heatmap画热度图
原文链接 https://blog.csdn.net/m0_38103546/article/details/79935671
- java锁的使用
1 synchronize和ReentrantLock synchronize锁是jvm内置的锁,它锁的是synchronize所在的类的对象,要同步那么就只能有一个对象. ReentrantLock ...
- 锋利的jQuery 要点归纳(一) jQuery选择器
1 基本选择器 $(#id) 根据给定的id匹配一个元素$(.class) 根据给定的类名匹配元素$(element) 根据给定的元素名匹配元素$(*) 匹配所有元素$(sel ...
- java不能卸载,提醒路劲找不到 *:\Java\
安装MyEclipse是提醒找不到java安装路劲 :*:\Java\jdk1.7.0_80 想卸载java重装也没法卸载,还是同样的提醒 找不到java安装路劲 :*:\Java\jdk1.7.0_ ...
- windows上安装 包管理工具choco及scoop
1.安装 choco: 1.1.使用管理员方式打开 PowerShell 1.2.输入 Set-ExecutionPolicy RemoteSigned,输入 Y 1.3.安装 choco输入:iwr ...
- 【NOI2007】项链工厂 ——老题新做.jpg
第一次是用 ODT 过的...(虽说跑得飞慢但它就是能过) 而且还写了发题解... 第二次是在考场上碰到了这道题,然后居然打了线段树,各种 bug 直接让代码爆零 但还是补好了代码重新交了一发,发现跑 ...
- 通过编写串口助手工具学习MFC过程——(三)Unicode字符集的宽字符和多字节字符转换
通过编写串口助手工具学习MFC过程 因为以前也做过几次MFC的编程,每次都是项目完成时,MFC基本操作清楚了,但是过好长时间不再接触MFC的项目,再次做MFC的项目时,又要从头开始熟悉.这次通过做一个 ...
- angularJS(一):表达式、指令
简介 以 JavaScript 编写的库,是一个 JavaScript 框架 一.表达式 AngularJS 使用 表达式 把数据绑定到 HTML. 表达式写在双大括号内:{{ expression ...
- 如何将一个.NET Core类库发布到NuGet
包治百病 | 如何将一个.NET Core类库发布到NuGet 写文章 包治百病 | 如何将一个.NET Core类库发布到NuGet Edi Wang发表于汪宇杰博客订阅 77 NuGet是.NET ...