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 ...
随机推荐
- struts2 2.5.16 通配符方式调用action中的方法报404
1.问题描述 在struts.xml中配置用通配符方式调用action中的add()方法,访问 http://localhost:8080/Struts2Demo/helloworld_add.act ...
- jyputer notebook 、jypyter、IPython basics
1 .修改jupyter默认工作目录:打开cmd,在命令行下指定想要进的工作目录,即键入“cd d/ G:\0工作面试\学习记录”标红部分是想要进入的工作目录. 2.Tab补全 a.在命令行输入表达 ...
- 使用使用dockerfile构建webapi镜像然后使用link和bridge两种方式进行桥接
首先新增一个webapi的项目 项目核心代码 UserContext using Microsoft.EntityFrameworkCore; using System; using System.C ...
- mysql驱动表与被驱动表及join优化
驱动表与被驱动表 先了解在join连接时哪个表是驱动表,哪个表是被驱动表:1.当使用left join时,左表是驱动表,右表是被驱动表2.当使用right join时,右表时驱动表,左表是驱动表3.当 ...
- Bubble Sort(冒泡排序)
冒泡排序(英语:Bubble Sort,台湾另外一种译名为:泡沫排序)是一种简单的排序算法.它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来.走访数列的工作是重复地进行 ...
- centos7安装nginx并配置前端环境
服务器环境:CentOS Linux release 7.5.1804 (Core) 安装路径:/usr/local 1.安装编译工具以及库文件 (新服务器,未安装则需要先安装) # yum -y i ...
- SpringMVC框架 课程笔记
SpringMVC框架 课程笔记 第0章 SpringMVC框架的核心内容 1.SpringMVC 概述 2.SpringMVC 的 HelloWorld 3.使用 @RequestMapping 映 ...
- nginx配置反向代理,解决前端开发的跨域问题
适用:开发和生产环境 配置如下 server { listen 10901; server_name res.pre.ices.red; #charset koi8-r; #access_log lo ...
- 关于原型链,原来这么简单?—————终结__proto__和prototype的那些事
今天,一个技术群里小朋友提出一个问题: Object.prototype.a = function () { console.log('a') } Function.prototype.b = fun ...
- PAT Advanced 1001 A+B Format (20 分)
Calculate a+b and output the sum in standard format -- that is, the digits must be separated into gr ...