Floyed算法 O(N3) x

Floyed算法 O(N3)

  简称Floyed(弗洛伊德)算法,是最简单的最短路径算法,可以计算图中任意两点间的最短路径。Floyed的时间复杂度是O (N3),适用于出现负边权的情况。

算法分析&思想讲解:

  三层循环,第一层循环中间点k,第二第三层循环起点终点i、j,算法的思想很容易理解:如果点i到点k的距离加上点k到点j的距离小于原先点i到点j的距离,那么就用这个更短的路径长度来更新原先点i到点j的距离。

我们在初始化时,把不相连的点之间的距离设为一个很大的数,不妨可以看作这两点相隔很远很远,如果两者之间有最短路径的话,就会更新成最短路径的长度。Floyed算法的时间复杂度是O(N3)。

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4
 5 using namespace std;
 6 const int Maxn=1001;
 7
 8 int maps[Maxn][Maxn];
 9 int ans;
10 int main() {
11     memset(maps,999999,sizeof(maps));
12     int n,m;
13     cin>>n>>m;
14     int he,ta,len;
15     for(int i=1; i<=m; i++) {
16         cin>>he>>ta>>len;
17         maps[ta][he]=maps[he][ta]=len;
18     }
19     int x,y;
20     cin>>x>>y;
21     for(int k = 1; k <= n; k++)
22         for(int i = 1; i <= n; i++)
23             for(int j = 1; j <= n; j++) {
24                 if(maps[i][j]>maps[i][k]+maps[k][j])
25                     maps[i][j]=maps[i][k]+maps[k][j];  //进行更新
26             }
27
28     printf("%d",maps[x][y]);
29 }
时间: 2024-10-19 11:14:53

Floyed算法 O(N3) x的相关文章

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算法的一些感想

虽然我还在学动态规划,但这并不影响我去试图研究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重循环,简

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]

算法大全(c,c++)

http://www.2cto.com/kf/201109/105758.html 算法大全(C,C++)一. 数论算法 1.求两数的最大公约数function gcd(a,b:integer):integer;beginif b=0 then gcd:=aelse gcd:=gcd (b,a mod b);end ; 2.求两数的最小公倍数function lcm(a,b:integer):integer;beginif a<b then swap(a,b);lcm:=a;while lcm

分享给某人的前端面试题库(二)-算法

基本算法(pascal) 1.数论算法 求两数的最大公约数 function gcd(a,b:integer):integer; begin if b=0 then gcd:=a else gcd:=gcd (b,a mod B); end; 求两数的最小公倍数 function lcm(a,b:integer):integer; begin if a< b then swap(a,B); lcm:=a; while lcm mod b >0 do inc(lcm,a); end; 素数的求法