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. BigDecimal进行加减乘除计算

    以前大部分关于查询计算的逻辑是在sql语句中执行的,但是有时候会出现比较复杂的计算情况,需要我们在代码中进行计算,这个时候使用BigDecimal进行计算会很方便. BigDecimal num1 = ...

  2. selenium:css_selector定位详解(css selector和xpath的比较)

    selenium使用css selector和xpath的比较 selenium提供的定位方式(常用) ID NAME CLASS CSS SELECTOR XPATH   推荐的定位方式的优先级 优 ...

  3. 关于migration build failed的问题

    首先一定要执行dotnet restore 查看网站的依赖关系(有时候生成是不报错的但是restore会找不到文件路径) 检查执行命令的路径是否是正确的当前网站路径 build failed一定是生成 ...

  4. @Scheduled(cron = "0/5 * * * * *")将时间改为配置

    有两种方法:第一种当然你可以把Scheduled写到xml文件中进行配置. 第二种在你的类前面添加 此处讲解第二种写法 第二种在你的类前面添加@PropertySource("classpa ...

  5. 逆序单词 HIhoCoder 1366 字典树

    逆序单词 HIhoCoder 1366 字典序 题意 在英文中有很多逆序的单词,比如dog和god,evil和live等等. 现在给出一份包含N个单词的单词表,其中每个单词只出现一次,请你找出其中有多 ...

  6. MyBatis插入并返回id技巧

    1, 使用返回插入id的值,这个值即是当前插入的id

  7. ThinkPHP5微信支付扩展库(超级简单, 超级超好用!)

    ThinkPHP5微信支付最新扩展库(2017年9月24日). 我的想法很简单,就是只需要调用一个静态方法就可以完成支付,查询,退款,查账等等, 无需重复造轮子, 专注自己业务!欢迎到Github查看 ...

  8. arcgis server10.2自带打印模板路径

    找到arcgis server10.2安装目录路径,我的安装路径为C盘,如下: C:\Program Files\ArcGIS\Server\Templates\ExportWebMapTemplat ...

  9. Linux下RabbitMQ安装、运行与管理

    Linux下RabbitMQ安装.运行与管理 安装erlang 安装参考官网 RabbitMQ的安装需要Erlang的基础环境,必须按照RabbitMQ Erlang版本要求进行安装. 关于Erlan ...

  10. Ajax加载数据后百度分享实例

    <script type="text/javascript"> //百度分享 function baidu_share() { var title_val = $(&q ...