连云建网站公司黄骅贴吧金宝
web/
2025/10/2 6:20:19/
文章来源:
连云建网站公司,黄骅贴吧金宝,珠海免费模板建站,抖音代运营是什么意思Floyd算法 1.定义概览 Floyd-Warshall算法#xff08;Floyd-Warshall algorithm#xff09;是解决任意两点间的最短路径的一种算法#xff0c;可以正确处理有向图或负权的最短路径问题#xff0c;同时也被用于计算有向图的传递闭包。Floyd-Warshall算法的时间复杂度为O(N3)…Floyd算法 1.定义概览 Floyd-Warshall算法Floyd-Warshall algorithm是解决任意两点间的最短路径的一种算法可以正确处理有向图或负权的最短路径问题同时也被用于计算有向图的传递闭包。Floyd-Warshall算法的时间复杂度为O(N3)空间复杂度为O(N2)。 2.算法描述 1)算法思想原理 Floyd算法是一个经典的动态规划算法。用通俗的语言来描述的话首先我们的目标是寻找从点i到点j的最短路径。从动态规划的角度看问题我们需要为这个目标重新做一个诠释这个诠释正是动态规划最富创造力的精华所在 从任意节点i到任意节点j的最短路径不外乎2种可能1是直接从i到j2是从i经过若干个节点k到j。所以我们假设Dis(i,j)为节点u到节点v的最短路径的距离对于每一个节点k我们检查Dis(i,k) Dis(k,j) Dis(i,j)是否成立如果成立证明从i到k再到j的路径比i直接到j的路径短我们便设置Dis(i,j) Dis(i,k) Dis(k,j)这样一来当我们遍历完所有节点kDis(i,j)中记录的便是i到j的最短路径的距离。 2).算法描述 a.从任意一条单边路径开始。所有两点之间的距离是边的权如果两点之间没有边相连则权为无穷大。 b.对于每一对顶点 u 和 v看看是否存在一个顶点 w 使得从 u 到 w 再到 v 比己知的路径更短。如果是更新它。 3).Floyd算法过程矩阵的计算----十字交叉法暂时没看懂望大神指教 方法两条线从左上角开始计算一直到右下角 如下所示 给出矩阵其中矩阵A是邻接矩阵而矩阵Path记录u,v两点之间最短路径所必须经过的点 相应计算方法如下 最后A3即为所求结果 3.算法代码实现 1 typedef struct 2 { 3 char vertex[VertexNum]; //顶点表 4 int edges[VertexNum][VertexNum]; //邻接矩阵,可看做边表 5 int n,e; //图中当前的顶点数和边数 6 }MGraph; 7 8 void Floyd(MGraph g)9 {
10 int A[MAXV][MAXV];
11 int path[MAXV][MAXV];
12 int i,j,k,ng.n;
13 for(i0;in;i)
14 for(j0;jn;j)
15 {
16 A[i][j]g.edges[i][j];
17 path[i][j]-1;
18 }
19 for(k0;kn;k)
20 {
21 for(i0;in;i)
22 for(j0;jn;j)
23 if(A[i][j](A[i][k]A[k][j]))
24 {
25 A[i][j]A[i][k]A[k][j];
26 path[i][j]k;
27 }
28 }
29 } 算法时间复杂度:O(n3) 结合代码 并参照上图所示 我们来模拟执行下 这样才能加深理解第一关键步骤当k执行到xiv,ju时计算出v到u的最短路径要通过x此时v、u联通了。第二关键步骤当k执行到uivjy此时计算出v到y的最短路径的最短路径为v到u再到y(此时v到u的最短路径上一步我们已经计算过来直接利用上步结果)。第三关键步骤当k执行到y时ivjw此时计算出最短路径为v到y(此时v到y的最短路径长在第二步我们已经计算出来了)再从y到w。 依次扫描每一点(k)并以该点作为中介点计算出通过k点的其他任意两点(i,j)的最短距离这就是floyd算法的精髓同时也解释了为什么k点这个中介点要放在最外层循环的原因. hdu-2544代码 #include stdio.h
#include string.h
#define MAX 1000000
int map[110][110];
int n;
void flyod()
{int i,j,k;for(k1;kn;k)for(i1;in;i){for(j1;jn;j)if(map[i][j](map[i][k]map[k][j]))map[i][j]map[i][k]map[k][j];}printf(%d\n,map[1][n]);
}
int main()
{int m;while(scanf(%d %d,n,m),n||m){int i,j,a,b,c;for(i0;in;i)for(j0;jn;j)map[i][j]MAX;for(i0;im;i){scanf(%d %d %d,a,b,c);if(cmap[a][b])map[a][b]map[b][a]c;}flyod();}return 0;
}
//ac
//flyod算法31ms 转载于:https://www.cnblogs.com/xl1027515989/p/3605553.html
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/85464.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!