floyed算法的一些感想

虽然我还在学动态规划,但这并不影响我去试图研究floyed,在对floyed算法进行研究了40min后,我感觉我似乎应该好像是勉强理解了floyed算法

for(int k=1;k<=n;k++)

for(int i=1;i<=n;i++)

for(int j=1;j<=k;j++)

if(f[i][k]+f[k][j]<f[i][j])

f[i][j]=f[i][k]+f[k][j];

以上为floyed的基础模板。Floyed算法,用来计算这个图上任意点对间的距离,3重循环,简单思考便知道,k表示要i - k和k - j去尝试更新i – j。

Floyed算法最神奇的地方在于k循环的位置,为什么要放在最外层而不是最内层,简单思索后,放在最外层是用k点一次更新所有点的距离,而放在最内层则是将i—j的距离尝试用所有点k去更新,乍一看似乎没有什么区别?好像是一样的,但是我们实际手动推算就会发现,没有这么简单!(没错就是手推,虽然暴力,但是极其有效。)

我们来想想这有什么区别先:

外层:用k更新所有i—j

内层:枚举所有k来更新i—j

区别就在于这两种更新方式的顺序变了,那么放在内层会产生如何影响呢?

for(int i=1;i<=n;i++)

for(int j=1;j<=k;j++)

for(int k=1;k<=n;k++)

if(f[i][k]+f[k][j]<f[i][j])

f[i][j]=f[i][k]+f[k][j];

如果k层在最内层,就是每次更新i—j时都要枚举一遍k点,但实际上,i—k却没有更新过,所以导致i—j无法更新,然后就会产生恶性循环,然后boom的炸掉,到最后也许只有几个幸运点对成功更新出正确距离

但是在外层呢?我们不得不赞叹floyed算法的强大与神奇,因为k点一次更新了所有的点对,所以在进行后续更新操作时,i—k的距离是肯定被更新过了的,保证了算法的正确性,感觉之所以说floyed用到了动态规划思想的原因实际是下一个i—j中,距离是否被更新,只与与j直接相连的k点的所记录的值,即i—k和k—j这个定值有关。

最后感叹floyed算法的强大与神奇。

原文地址:https://www.cnblogs.com/ywjblog/p/8547493.html

时间: 2024-10-09 20:45:33

floyed算法的一些感想的相关文章

Dijkstra算法和Floyed算法

写的比较好的三篇文章 Floyed算法 最短路径-Dijkstra算法和Floyed算法 最短路径之Dijkstra算法和Floyed算法 哈哈,他山之石,可以攻玉 自己有心得,慢慢补充

floyed算法

Floyed算法(实际是动态规划问题) 问题:权值矩阵matrix[i][j]表示i到j的距离,如果没有路径则为无穷 求出权值矩阵中任意两点间的最短距离 分析:对于每一对定点u,v看是否存在一个点w使从u到w再到v的路径长度比已知路径短 如果有则更新从u到w的距离 参考网页 1:不用状态压缩的动态规划算法: 状态定义:d[1][i][j]表示以1作为媒介时从i到j的最短距离 d[2][i][j]表示以1,2中的点作为媒介时从i到j的最短距离 …… d[n][i][j]表示以1,2, ……n中的点

Floyed算法 O(N3) x

Floyed算法 O(N3) 简称Floyed(弗洛伊德)算法,是最简单的最短路径算法,可以计算图中任意两点间的最短路径.Floyed的时间复杂度是O (N3),适用于出现负边权的情况. 算法分析&思想讲解: 三层循环,第一层循环中间点k,第二第三层循环起点终点i.j,算法的思想很容易理解:如果点i到点k的距离加上点k到点j的距离小于原先点i到点j的距离,那么就用这个更短的路径长度来更新原先点i到点j的距离. 我们在初始化时,把不相连的点之间的距离设为一个很大的数,不妨可以看作这两点相隔很远很远

天翼杯大数据算法应用大赛感想

竞赛过去很久了,早就想写写感想与经历,可是一直拖着没写.今天终于有时间了,就写写吧. 竞赛题目是视频网站推荐,根据前七周每天用户对10个视频网站的访问次数数据以及其他上网行为,预测用户第八周对10个视频网站的访问量. 咋一看这是个时间序列预测问题,是啊,给出前49天用户访问数据,让你预测未来七天用户访问数据.这确实应该是个时间序列预测问题. 但我用时间预测算法模型Holt-Winter(3次指数平滑), ARIMA跑结果的时候,结果却并不是很好. 我后来分析了下数据,统计了七周每一周七天内用户对

谈谈对系统学习计算机算法重要性的感想

在解决一道利用二分算法就很简单,不知道二分算法就无从下手的问题过程中,可以深刻体会到算法的重要性. 题目 现在,让我们放空自己,来看一道题目: 给一棵二叉树,找出从根节点出发到叶节点的路径中,和最大的一条.返回该和. 如下,返回4 1 / 2 3 题目中的例子过于简单,举个复杂些的例子: 1 / 6 7 / \ / 3 12 1 2 解题思路 如果高中的你,并不知道"分治算法",你该怎么解这个题目?只能说很难. 常规思路是每往下一层,就判断哪个分支更大(1->7分支),但这只是贪

Floyed算法c语言实现

#include<stdio.h> #include<stdlib.h> #define max 1000000000 int d[1000][1000],path[1000][1000]; int main() { int i,j,k,m,n; int x,y,z; scanf("%d%d",&n,&m); for(i=1;i<=n;i++) for(j=1;j<=n;j++){ d[i][j]=max; path[i][j]=j;

最短路径Floyed算法

使用有向图的邻接矩阵的概念,代码如下: struct Graph { int vertex[vertexnum];/*?¨μ?±í*/ int edges[vertexnum][vertexnum];/*áú?ó???ó*/ int n,e/*í??Dμ??¥μ?êyoí±?êy*/ }g; void Floyd() { int A[mxav][mxav]; int path[maxv][maxv]; int n=g.n; for(int i=0;i<n;i++) { for(int j=0;j

[ACM] 最短路算法整理(bellman_ford , SPFA , floyed , dijkstra 思想,步骤及模板)

以杭电2544题目为例 最短路 Problem Description 在每年的校赛里,所有进入决赛的同学都会获得一件很漂亮的t-shirt.但是每当我们的工作人员把上百件的衣服从商店运回到赛场的时候,却是非常累的!所以现在他们想要寻找最短的从商店到赛场的路线,你可以帮助他们吗? Input 输入包括多组数据.每组数据第一行是两个整数N.M(N<=100,M<=10000),N表示成都的大街上有几个路口,标号为1的路口是商店所在地,标号为N的路口是赛场所在地,M则表示在成都有几条路.N=M=0

最短路算法(floyed+Dijkstra+bellman-ford+SPFA)

最短路算法简单模板 一.floyed算法 首先对于floyed算法来说就是最短路径的动态规划解法,时间复杂度为O(n^3) 适用于图中所有点与点之间的最短路径的算法,一般适用于点n较小的情况. Floyed算法有三层循环,循环的层次先后顺序也是比较重要的,分别为k ,i,j:因为dis[k][i][j]代表的是i节点到j节点的最短路如果中间经过节点k的话dis[k][i][j] =dis[k-1][i][k]+dis[k-1][k][j]:否则dis[k][i][j] = dis[k-1][i]