Floyd算法

问题的提出:已知一个有向网(或者无向网),对每一对定点vi!=vj,要求求出vi与vj之间的最短路径和最短路径的长度。

解决该问题有以下两种方法:

(1)轮流以每一个定点为源点,重复执行Dijkstra算法或者Bellman-Ford算法n次,就可以求出每一对顶点之间的最短路径和最短路径的长度,总的时间复杂度为O(n^3)。

(2)采用Floyd算法,时间复杂度也是O(n^3),但是形式更为直接。

1.介绍

floyd算法只有五行代码,代码简单,三个for循环就可以解决问题,所以它的时间复杂度为O(n^3),可以求多源最短路问题。

2.思想:

Floyd算法的基本思想如下:从任意节点A到任意节点B的最短路径不外乎2种可能,1是直接从A到B,2是从A经过若干个节点X到B。所以,我们假设Dis(AB)为节点A到节点B的最短路径的距离,对于每一个节点X,我们检查Dis(AX) + Dis(XB)

举个例子:已知下图,

如现在只允许经过1号顶点,求任意两点之间的最短路程,只需判断e[i][1]+e[1][j]是否比e[i][j]要小即可。e[i][j]表示的是从i号顶点到j号顶点之间的路程。e[i][1]+e[1][j]表示的是从i号顶点先到1号顶点,再从1号顶点到j号顶点的路程之和。其中i是1~n循环,j也是1~n循环,代码实现如下。

1 for(i=1; i<=n; i++)2 {3 for(j=1; j<=n; j++)4 {5 if ( e[i][j] > e[i][1]+e[1][j] )6 e[i][j] = e[i][1]+e[1][j];7 }8 }

接下来继续求在只允许经过1和2号两个顶点的情况下任意两点之间的最短路程。在只允许经过1号顶点时任意两点的最短路程的结果下,再判断如果经过2号顶点是否可以使得i号顶点到j号顶点之间的路程变得更短。即判断e[i][2]+e[2][j]是否比e[i][j]要小,代码实现为如下。

1 //经过1号顶点

2 for(i=1; i<=n; i++)3 for(j=1; j<=n; j++)4 if (e[i][j] > e[i][1]+e[1][j])5 e[i][j]=e[i][1]+e[1][j];6 //经过2号顶点

7 for(i=1; i<=n; i++)8 for(j=1; j<=n; j++)9 if (e[i][j] > e[i][2]+e[2][j])10 e[i][j]=e[i][2]+e[2][j];

最后允许通过所有顶点作为中转,代码如下:

1 for(k=1; k<=n; k++)///Floyd-Warshall算法核心语句

2 {3 for(i=1; i<=n; i++)4 {5 for(j=1; j<=n; j++)6 {7 if(map[i][j]>map[i][k]+map[k][j] )8 {9 map[i][j]=map[i][k]+map[k][j];10 }11 }12 }13 }

这段代码的基本思想就是:最开始只允许经过1号顶点进行中转,接下来只允许经过1和2号顶点进行中转……允许经过1~n号所有顶点进行中转,求任意两点之间的最短路程。与上面相同

3.代码模板:

1 #include

2 #define inf 0x3f3f3f3f

3 int map[1000][1000];4 intmain()5 {6 int k,i,j,n,m;///n表示顶点个数,m表示边的条数

7 scanf("%d %d",&n,&m);8 for(i=1; i<=n; i++)///初始化

9 {10 for(j=1; j<=n; j++)11 {12 if(i==j)13 map[i][j]=0;14 else

15 map[i][j]=inf;16 }17 }18 inta,b,c;19 for(i=1; i<=m; i++)///有向图

20 {21 scanf("%d %d %d",&a,&b,&c);22 map[a][b]=c;23 }24 for(k=1; k<=n; k++)///Floyd-Warshall算法核心语句

25 {26 for(i=1; i<=n; i++)27 {28 for(j=1; j<=n; j++)29 {30 if(map[i][j]>map[i][k]+map[k][j] )31 {32 map[i][j]=map[i][k]+map[k][j];33 }34 }35 }36 }37 for(i=1; i<=n; i++)///输出最终的结果,最终二维数组中存的即使两点之间的最短距离

38 {39 for(j=1; j<=n; j++)40 {41 printf("%10d",map[i][j]);42 }43 printf("\n");44 }45 return 0;46 }

任意两点最短路floyd算法matlab,多源最短路——Floyd算法相关推荐

  1. dijkstra算法PHP,单源最短路径(dijkstra算法)php实现

    做一个医学项目,其中在病例评分时会用到单源最短路径的算法.单源最短路径的dijkstra算法的思路如下: 如果存在一条从i到j的最短路径(Vi.....Vk,Vj),Vk是Vj前面的一顶点.那么(Vi ...

  2. bartlett 算法 matlab,GWO(灰狼优化)算法MATLAB源码逐行中文注解(转载)

    以优化SVM算法的参数c和g为例,对GWO算法MATLAB源码进行了逐行中文注解. tic % 计时器 %% 清空环境变量 close all clear clc format compact %% ...

  3. pid算法matlab仿真程序和c程序,pid算法matlab仿真程序和c程序.doc

    pid算法matlab仿真程序和c程序.doc 1 增量式 PID 控制算 法 Matlab 仿真程序 设一被控对象 G(s) =50/(0.125s^2+7s),用增量式 PID 控制 算法编写仿真 ...

  4. LevalSet水平集分割算法 matlab程序源码

    首先,我见了一个图像处理讨论群,感兴趣的同学们可以加一下,图像处理讨论社:397489395 基于水平集的图像分割算法算是一种进化的snake算法,是一种隐式函数的方法,目前代码以及原理还处于深究阶段 ...

  5. 最坏适应算法c语言源码,首次适应算法,最佳适应算法,最坏适应算法源代码

    这是一个非常完美的程序,输出显示的格式也很棒,里面包含首次适应算法,最佳适应算法,最坏适应算法 #include #include #define Free 0 //空闲状态 #define Busy ...

  6. 蓝桥杯最短路(java过)spfa单源最短路算法

    spfa 百度百科上spfa的思路为:动态逼近法:设立一个先进先出的队列用来保存待优化的结点,优化时每次取出队首结点u,并且用u点当前的最短路径估计值对离开u点所指向的结点v进行松弛操作,如果v点的最 ...

  7. a*算法matlab代码_NSGAII多目标优化算法讲解(附MATLAB代码)

    小编今天为大家讲解NSGA-II多目标优化算法,提到多目标优化,大家可能第一个就想到NSGA-II算法,今天小编就带领大家解开NSGA-II的神秘面纱. NSGA-II全称是快速非支配排序遗传算法,这 ...

  8. ncut算法matlab实现,ncut_multiscale_1_6 经典的图像分割算法 的Matlab代码。 238万源代码下载- www.pudn.com...

    文件名称: ncut_multiscale_1_6下载 收藏√  [ 5  4  3  2  1 ] 开发工具: matlab 文件大小: 587 KB 上传时间: 2015-04-17 下载次数: ...

  9. 人工势场算法 Matlab版源码

    人工势场算法,用于路径规划 main.m程序 %初始化车的参数 Xo=[0 0];%起点位置 k=15;%计算引力需要的增益系数 K=0;%初始化 m=5;%计算斥力的增益系数,都是自己设定的. Po ...

最新文章

  1. python课程多少钱一节课-日照少儿python编程一节课多少钱
  2. flask查询mysql数据展示_flask再学习-思考之怎么从数据库中查询数据在页面展示!...
  3. python-OpenCV之numpy数组操作
  4. Linux文件inode用完一例
  5. 用c语言编程图书管理系统,C语言图书管理系统简洁版
  6. 使用sql语句查询access数据库
  7. Windows下sqlmap安装方法
  8. 解决tomcat内存溢出问题
  9. 共轭梯度法的简单直观理解
  10. 数据库建模工具Pdman
  11. python爬虫数据(中国人口信息)存入MYSQL数据库
  12. 不知如何选股?不知哪种指标策略可靠?量化分析比较DMA、DMI、MACD、KDJ、BOLL指标策略收益情况
  13. Linux 存储 Stack详解
  14. 老大让我看baidu他们的查公交是怎么做的,我就看了
  15. 【联邦学习+区块链】联邦学习与区块链
  16. 从简易计算器到设计模式(策略、简单工厂)
  17. c#使用Flash控件AxShockwaveFlash
  18. Paper:LIME之《Why Should I Trust You? Explaining the Predictions of Any Classifier为什么要相信你?解释任何分类器的预测》翻
  19. [论文阅读1]Re-identification with RGB-D sensors
  20. 法硕(非法学)进入红圈所究竟有多难?

热门文章

  1. C#与Javascript变量、函数之间的相互调用2008年11月28日 星期五 05:28 P.M.1.如何在JavaScript访问C#函数?
  2. 通过实例理解Spring的Bean工厂和AOP框架
  3. Servlet 单例多线程
  4. 使用BeanPostProcessor接口对受管Bean进行预处理
  5. stm32串口学习(二)
  6. 汽车行驶姿态 -- 初识
  7. linux pppd源码下载_pppd源代码分析
  8. PoW 本质上是个去中心化的时钟
  9. 浅谈以太坊智能合约的设计模式与升级方法
  10. 以太坊Oracle系列一: Human Oracle