只有五行的算法--floyd-warshall

floyd-warshall算法用来求最短路径(即动态规划)求任意两点的最短距离

时间复杂度为O(N3),空间复杂度为O(N2)。

到达目的地有两种方法,一:直接点对点,没有中转站。二:经过中转站直接到达。

在求最短路径前,先谈谈地图的存储

如图,使用二元数组存储。图中无穷大代表没有道路,e[1][2]=2代表1城市到2城市的路径

核心代码

   for (int k = 0; k <= 3; k++)
            for (int i = 0; i < 4; i++)
                for (int j = 0; j < 4; j++) {
                    if (map[i][j] > map[i][k] + map[k][j]) {
                        map[i][j] = map[i][k] + map[k][j];
                    }
                }

  就五行。

时间: 2024-10-12 13:25:11

只有五行的算法--floyd-warshall的相关文章

只有五行的算法》》Foloyd-Warshall算法(多元最短路径问题)

#include<stdio.h> int main() { int INF=9999999;//音节划分:无穷的 infinite int map[100][100]; int N,M; scanf("%d%d",&N,&M); int i,j; int k; for(i=1;i<=N;i++) for(j=1;j<=N;j++){ if(i==j) map[i][j]=0; else map[i][j]=INF; } int m; for(k

最短路算法 :Bellman-ford算法 &amp; Dijkstra算法 &amp; floyd算法 &amp; SPFA算法 详解

 本人QQ :2319411771   邮箱 : [email protected] 若您发现本文有什么错误,请联系我,我会及时改正的,谢谢您的合作! 本文为原创文章,转载请注明出处 本文链接   :http://www.cnblogs.com/Yan-C/p/3916281.html . 很早就想写一下最短路的总结了,但是一直懒,就没有写,这几天又在看最短路,岁没什么长进,但还是加深了点理解. 于是就想写一个大点的总结,要写一个全的. 在本文中因为邻接表在比赛中不如前向星好写,而且前向星效率并

几个最短路径算法Floyd、Dijkstra、Bellman-Ford、SPFA的比较(转)

几大最短路径算法比较 几个最短路径算法的比较:Floyd        求多源.无负权边(此处错误?应该可以有负权边)的最短路.用矩阵记录图.时效性较差,时间复杂度O(V^3).       Floyd-Warshall算法(Floyd-Warshall algorithm)是解决任意两点间的最短路径的一种算法,可以正确处理有向图或负权的最短路径问题. Floyd-Warshall算法的时间复杂度为O(N^3),空间复杂度为O(N^2). Floyd-Warshall的原理是动态规划:设Di,j

多源最短路算法——floyd算法

1 #include<bits/stdc++.h> 2 #define ll long long 3 #define scan(i) scanf("%d",&i) 4 #define scand(i) scanf("%lf",&i) 5 #define scanl(i) scanf("%lld",&i) 6 #define f(i,a,b) for(int i=a;i<=b;i++) 7 #define

多源最短路径算法—Floyd算法

前言 在图论中,在寻路最短路径中除了Dijkstra算法以外,还有Floyd算法也是非常经典,然而两种算法还是有区别的,Floyd主要计算多源最短路径. 在单源正权值最短路径,我们会用Dijkstra算法来求最短路径,并且算法的思想很简单--贪心算法:每次确定最短路径的一个点然后维护(更新)这个点周围点的距离加入预选队列,等待下一次的抛出确定.但是虽然思想很简单,实现起来是非常复杂的,我们需要邻接矩阵(表)储存长度,需要优先队列(或者每次都比较)维护一个预选点的集合.还要用一个boolean数组

图的最短路径算法-- Floyd算法

Floyd算法求的是图的任意两点之间的最短距离 下面是Floyd算法的代码实现模板: const int INF = 10000000; const int maxv = 200; // maxv为最大顶点数 int n, m; // n 为顶点数,m为边数 int dis[maxv][maxv]; // d[i][j]表示顶点i顶点j的最短距离 void Floyd(){ for (int k = 0; k < n; k++){ for (int i = 0; i < n; i++){ fo

最短路径(一)—Floyd-Warshall(只有五行的算法)

"多源最短路径"--计算任意两个城市之间的最短路径. 上图中有4个城市8条公路,公路上的数字表示这条公路的长短.公路是单向的.我们现在需要求任意两个城市之间的最短路径,也就是求任意两个点之间的最短路径.这个问题称为"多源最短路径"问题. 用4*4的矩阵存储图的信息,二维数组e存储. 之前通过dfs和bfs可以求出两点之间的最短路径.所以进行n^2遍深度或者广度优先搜索,即对每两个点都进行一次深度或者广度优先搜索,便可求的任意两点之间的最短路径. Floyd-Wars

只有五行的算法——Floyd-Warshall

基本思想:最开始只允许经过1号顶点进行中转,接下来只允许经过1和2号顶点进行中转......允许经过1~n号所有顶点进行中转,求任意两点之间的最短路径. 用一句话概括就是:从 i 号顶点到 j 号顶点只经过前 k 号点的最短路径. 时间复杂度O(N^3). Code: #include <stdio.h> #include <string.h> #include <stdlib.h> #define INF 999999 int main(int argc, char

图的最短路算法 Floyd

多源最短路径算法 时间复杂度O(N3) 简单修改可求有向图的传递闭包 #include<iostream> using namespace std; const int maxn=1024; const int inf=1<<30; int d[maxn][maxn]; int n,m; void init() { for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) d[i][j]=(i==j?0:inf); } int main()