Floyed理解「建议收藏」

Floyed理解「建议收藏」Floyed理解 Floyd算法的本质是动态规划,其转移方程为:f(k,i,j)=min(f(k-1,i,j),f(k-1,i,k)+f(k-1,k,j))。f(k-1,i,j)表示经过前k-1个点f(k-1,i,k)+f(k-1,k,j)表示经过k这个点f(k,i,j)表示路径除开起点i与终点j,只经过前k个点中的某些点,从i到j的最小值。计算这个值只需要考…

大家好,又见面了,我是你们的朋友全栈君。

Floyed理解

Floyed理解「建议收藏」

 

Floyd算法的本质是动态规划,其转移方程为:f(k,i,j) = min( f(k-1,i,j), f(k-1,i,k)+f(k-1,k,j) )

f(k-1,i,j)表示经过前k-1个点

f(k-1,i,k)+f(k-1,k,j)表示经过k这个点

f(k,i,j)表示路径除开起点i与终点j,只经过前k个点中的某些点,从i到j的最小值。

计算这个值只需要考虑两种情况:最短路经过k,和最短路不经过k(那么就经过前k-1个点中的某些点)。

由于k要从k-1转移而来,自然k为最外层的循环。而经过状态压缩(类似于背包问题)后,就变成了我们熟悉的f(i,j) = min( f(i,j), f(i,k)+f(k,j) )了。

 

 

接下来,是Floyd算法的更新过程。归纳一下它的更新过程,其实就是,每一次尝试在每一对节点Vv和Vw之间插入一个节点Vk,如果插入节点后,可以使得Vv和Vw之间的路径变短,那么进行一次更新,否则不更新。

那么,为什么按照这样的规则更新可以找到每对节点间的最短路径呢?我在这里举个例子说明一下,应该就可以把这个问题解释清楚了。假设我们事先已经知道从节点V2到V5之间的最短路径是:V2→V4→V9→V7→V5。

第一步,在初始化过程中,我们获得了(*D)[2][9]、(*D)[9][5]、(*D)[2][5]以及(*P)[2][9]、(*P)[9][5]、(*P)[2][5]的初始值。

第二步,按照Floyd算法进行迭代,迭代到k等于4时,我们会发现在V2和V9之间插入V4之后,V2和V9之间的路径长度达到了史上最低点,(*D)[2][9]更新为(*D)[2][4]+(*D)[4][9],(*P)[2][9]更新为4。而且在之后的迭代中都不会出现更短的路径,所以(*D)[2][9]和(*P)[2][9]在之后的迭代中都不会发生改变。

第三步,迭代到k等于7时,V9和V5之间的路径长度达到了史上最低点,(*D)[9][5]更新为(*D)[9][7]+(*D)[7][5],(*P)[9][5]更新为7,此后不再改变。

第四步,迭代到k等于9时,V2和V5之间的路径长度达到了史上最低点,(*D)[2][5]更新为(*D)[2][9]+(*D)[9][5],(*P)[2][5]更新为9,此后不再改变。这样也就找到了V2和V5之间的最短路径。

现在,我们算出了V2和V5之间的最短路径的长度,但是,怎样找到这条路径的轨迹呢?其实就是根据*P来推断。以上面的例子为例,如果我们要打印V2和V5之间的最短路径的轨迹。首先我们知道(*P)[2][5]=9,初步确定轨迹为V2→V9→V5。根据(*P)[2][9]=4且(*P)[9][5]=7,初步确定轨迹为V2→V4→V9→V7→V5。根据(*P)[2][4]=2,(*P)[4][9]=4,(*P)[9][7]=9,(*P)[7][5]=7,我们可以确定没有新的节点需要加入,所以确定最终的轨迹为V2→V4→V9→V7→V5。

 

Floyed题目推荐:

【P1119】灾后重建 – 洛谷
https://www.luogu.org/problem/show?pid=1119

【P1078】文化之旅 – 洛谷
https://www.luogu.org/problem/show?pid=1078

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/148322.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • latex中如何正确输入 双引号「建议收藏」

    latex中如何正确输入 双引号「建议收藏」latex中输入双引号时,如果都直接用键盘上的双引号键,打出的是一顺撇的。左面引号的正确输入法是:按两次“Tab上面,数字1左面那个键”。至于后边的引号,与老方法是一样的,即按两次单引号键(或一次SHIFT+单引号键—也就是一次双引号键啦怎么输入左单引号、左双引号、右单引号、有双引号?左单引号:`(键盘上1旁边的那个);左双引号:“;右单引号:'(键盘分号的右边那个);右双引号:”或”。在

  • C语言教你怎么改变字体颜色

    C语言教你怎么改变字体颜色初学c的小伙伴可能已经对那个黑底白字的框有些厌倦了,不妨加点颜色,增加加可读性.

  • matlab中错误使用fmincon,MATLAB中fmincon 函数问题

    matlab中错误使用fmincon,MATLAB中fmincon 函数问题MATLAB中fmincon函数问题Matlab的fmincon优化问题请问:各位高手帮忙看看我的程序又什么问题?显示错误Errorin==>Funat33[w,fval]=fmincon(@fun2,w0,[],[],Aeq,Beq,@myfuntestcon,options)程序如下@fun2文件内容functionf=fun2(w)n=64;y=zeros(n,1);i=…

  • GetType和typeof的区别 以及一个小实例

    GetType和typeof的区别 以及一个小实例

  • Hadoop面试题[通俗易懂]

    Hadoop面试题[通俗易懂]文章目录你们公司集群有多少机器,内存,硬盘,CPU?你们Hadoop、Hive、Kafka都是什么版本?你们每天的数据量有多少?数据总量是多少?分布式和集群的区别?Hadoop1和Hadoop2的区别?Hadoop1Hadoop2NameNode运行处理什么是Hadoop?说一说Hadoop的shuffle过程?Hadoop中为什么需要排序?HDFS相关概念特点缺点BlockNameNodeDataNodeEditLogFSImageSecondaryNameNodefsimage和edits合

  • layui官网将于2021年10月13日下架

    layui官网将于2021年10月13日下架前言:在刚听到这个小时的时候,真的感觉很意外,从16-17年接触他一来,相对bootstrap等其他的jquey框架来说,layui算是功能最强大,社区最活跃的一款jquery框架了,至少我是这么认为的,他的功能也很强大。官方通告:官方gitee入口所有对layui为之热爱、鞭策、奉献,和支持过的开发者:请接受我用意念和字节传达的深深歉意。这是一个无力、无奈,甚至无助的决定:layui官网将于2021年10月13日进行下线。届时,包括新版下载、文档和示…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号