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求解最短路的更多相关文章

  1. 关于Floyd求解最小环的问题

    最近学习了floyd的奇妙用处,求解最小环,自己的领悟写在了纸上. 对于一个最小环,显然至少要包含三个点(此处不把两个点的回路称之为环) 从大体上考虑的话,一定有一个点与左右两侧的点是直接连接的(即不 ...

  2. 关于SPFA Bellman-Ford Dijkstra Floyd BFS最短路的共同点与区别

    关于模板什么的还有算法的具体介绍 戳我 这里我们只做所有最短路的具体分析. 那么同是求解最短路,这些算法到底有什么区别和联系: 对于BFS来说,他没有松弛操作,他的理论思想是从每一点做树形便利,那么时 ...

  3. UESTC 30 &&HDU 2544最短路【Floyd求解裸题】

    最短路 Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submiss ...

  4. Floyd 求最短路(poj 1161)

    Floyd-Warshall算法介绍: Floyd-Warshall算法的原理是动态规划. 设为从到的只以集合中的节点为中间节点的最短路径的长度. 若最短路径经过点k,则: 若最短路径不经过点k,则. ...

  5. dijkstra,SPFA,Floyd求最短路

    Dijkstra: 裸的算法,O(n^2),使用邻接矩阵: 算法思想: 定义两个集合,一开始集合1只有一个源点,集合2有剩下的点. STEP1:在集合2中找一个到源点距离最近的顶点k:min{d[k] ...

  6. [JSOI2007]重要的城市 floyd:最短路计数

    ---题面--- 题解: 其实感觉还是比较妙的,第一眼看题想到floyd统计最短路条数, 注意到对于任意两点x,y而言,floyd将会枚举其最短路所可能经过的所有中转点, 因此我们可以直接分别统计对于 ...

  7. Bellman-ford算法、SPFA算法求解最短路模板

    Bellman-ford 算法适用于含有负权边的最短路求解,复杂度是O( VE ),其原理是依次对每条边进行松弛操作,重复这个操作E-1次后则一定得到最短路,如果还能继续松弛,则有负环.这是因为最长的 ...

  8. HDU 4034 Graph(floyd,最短路,简单)

    题目 一道简单的倒着的floyd. 具体可看代码,代码可简化,你有兴趣可以简化一下,就是把那个Dijsktra所实现的功能放到倒着的floyd里面去. #include<stdio.h> ...

  9. Minimum Transport Cost Floyd 输出最短路

    These are N cities in Spring country. Between each pair of cities there may be one transportation tr ...

随机推荐

  1. ES6标准入门 第四章:字符串的扩展

    1.字符串的Unicode 表示法 JavaScript 允许采用 \uxxxx 表示一个字符,其中 xxxx 表示字符的码点. "\u0061" // "a" ...

  2. Web Service自动化测试知识点导图

  3. Java多线程学习——例子:模拟电影院抢座位

    Cinema——List<Integer>数据结构存储电影院座位 public class Cinema{ private List<Integer> seats; //剩余座 ...

  4. Ubuntu 16.04 设置静态IP 注意事项

    目录 查看动态ip下的网络信息 查看默认网关 设置静态网络 查看动态ip下的网络信息 1 ifconifg # 查看网卡信息: 可以看出网口名称为 eno1, 以及子网掩码(mask) 查看默认网关 ...

  5. linux 查看汉字编码方式

    hexdump -C b.bcp 09 为\t 0a 为\n 一个汉字占三位为utf-8  占两位的不对

  6. servlet3.0文件上传与下载

    描述:文件上传与下载是在JavaEE中常见的功能,实现文件上传与下载的方式有多种,其中文件上传的方式有: (1)commons-fileupload: (2)Servlet 3.0 实现文件上传 (3 ...

  7. 牛客练习赛51 C 勾股定理

    链接:https://ac.nowcoder.com/acm/contest/1083/C 题目描述 给出直角三角形其中一条边的长度n,你的任务是构造剩下的两条边,使这三条边能构成一个直角三角形. 输 ...

  8. [LeetCode] 132. 分割回文串 II

    题目链接 : https://leetcode-cn.com/problems/palindrome-partitioning-ii/ 题目描述: 给定一个字符串 s,将 s 分割成一些子串,使每个子 ...

  9. NoSQL特点

  10. Desert King(01分数规划问题)(最优斜率生成树)

    Desert King Time Limit: 3000MS   Memory Limit: 65536K Total Submissions:33847   Accepted: 9208 Descr ...