1、问题引入

  带权有向图中单源点的最短路径问题可以用地杰斯特拉算法求解,如果要求解图中每一对顶点之间的最短路径,类似可以想到的方法为:每次以一个顶点为源点,重复执行地杰斯特拉算法算法n次,这样,便可以求得每一对顶点之间的最短路径,总的执行时间为O(n3)。

  这里可以采用另外一种求解算法:Floyd算法。

2、Floyd的基本思想为:

  从邻接矩阵a开始进行n次迭代,第一次迭代后a[i,j]的值是从vi到vj且中间不经过变化大于1的顶点的最短路径长度;第k次迭代后a[i,j]的值是从vi到vj且中间不经过变化大于k的顶点的最短路径长度 第n次迭代后a[i,j]的值就是从vi到vj的最短路径长度。

3、算法描述:

  (1) 用数组d[i][j]来记录i,j之间的最短距离。初始化d[i][j],若i=j则d[i][j]=0,
    若i,j之间有边连接则d[i][j]的值为该边的权值,否则d[i][j]的值为max 。
  (2) 对所有的k值从1到n,修正任意两点之间的最短距离,计算d[i][k]+d[k][j]的值,
    若小于d[i][j],则d[i][j]= d[i][k]+d[k][j],否则d[i][j]的值不变。

4、具体实现:

  带权有向图如下:

在2.txt文件中保存的带权有向图的数据为:

其中第一个数据4表述图中有4个节点,其他的四行四列数据表示各个节点之间的路径长度,9999表示两个节点之间不可达。

具体代码为:

 1 #include<stdio.h>
 2 #include<stdlib.h>
 3 #define max 9999
 4 void Floyd(int,int **,int**,int**);
 5 void Searchpath(int,int,int**,int**);
 6 void main()
 7 {
 8     int i,j,num,first,last;
 9     FILE *p;
10     p=fopen("2.txt","r");
11     if(p==NULL)
12     {
13         printf("无法打开2.txt");
14         exit(-1);
15     }
16     fscanf(p,"%d",&num);//获取点的个数;
17     int **a=(int**)malloc(sizeof(int*)*num);
18     for(i=0;i<num;i++)
19         a[i]=(int*)malloc(sizeof(int)*num);
20     for(i=0;i<num;i++)//获取图中各个点之间的路径长度;
21         for(j=0;j<num;j++)
22             fscanf(p,"%d",&a[i][j]);
23     //path[i][j]用于记录从i到j的最短路径上j点的前一个节点
24     int **path=(int**)malloc(sizeof(int*)*num);
25     for(i=0;i<num;i++)
26         path[i]=(int*)malloc(sizeof(int)*num);
27     //d[i][j]用于记录从i到j的最短路径的长度
28     int **d=(int**)malloc(sizeof(int*)*num);
29     for(i=0;i<num;i++)
30         d[i]=(int*)malloc(sizeof(int)*num);
31     //佛洛依德算法程序调用
32     Floyd(num,path,d,a);
33     printf("最终得到的距离矩阵为:\n");
34     for(i=0;i<num;i++)
35     {
36         for(j=0;j<num;j++)
37             printf("%d  ",d[i][j]);
38         printf("\n");
39     }
40     printf("请输入起始点(小于%d):",num);
41     scanf("%d",&first);
42     printf("\n请输入终止点(小于%d):",num);
43     scanf("%d",&last);
44     printf("起始点%d到终止点%d的最短路径长度为:%d\n",first,last,d[first][last]);
45     Searchpath(first,last,path,d);//利用path[i][j]得出从i到j的最短路径
46 }
47 void Floyd(int num,int **path,int**d,int **a)
48 {
49     int i,j,k;
50     for(i=0;i<num;i++)
51     {
52         for(j=0;j<num;j++)//初始化
53         {
54             if(a[i][j]<max) path[i][j]=j;//从i到j有路径
55             else path[i][j]=-1;
56             d[i][j]=a[i][j];
57         }
58     }
59     for(k=0;k<num;k++)
60         for(i=0;i<num;i++)
61             for(j=0;j<num;j++)
62                 if(d[i][j]>d[i][k]+d[k][j])//从i到j的一条更短的路径
63                 {
64                     d[i][j]=d[i][k]+d[k][j];
65                     path[i][j]=path[i][k];
66                 }
67 }
68 void Searchpath(int first,int last,int **path,int**d)
69 {
70     int k;
71     if(d[first][last]==max)
72         printf("起始点%d到终止点%d不可达",first,last);
73     else
74     {
75         printf("起始点到终点的路径为:");
76         k=last;
77         printf("%d <-- ",k);
78         while((k!=first)&&(k!=path[first][k]))
79         {
80             k=path[first][k];
81             printf("%d <-- ",k);
82             if(k==path[first][k])
83                 k=first;
84         }
85         printf("%d\n",first);
86     }
87 }

5、参考资料:

  (1)严蔚敏,数据结构。

  (2)http://blog.sina.com.cn/s/blog_3fe961ae0100nl6g.html

  (3)http://zhidao.baidu.com/question/349458736.html

佛洛依德算法的学习与实现相关推荐

  1. 最短路径算法之迪杰斯特拉算法(Dijkstra)和佛洛依德算法(Floyd)

    今天学习了这两种算法,都是用来求最小路径的算法,但是迪杰斯特拉算法只能从某个特定点到所有点的最短路径,而佛洛依德算法可以查出任意点到任意点的最小路径. 迪杰斯特拉: package dijkstra; ...

  2. 十大常用算法之佛洛依德算法

    十大常用算法的完整实现 一.二分查找算法:https://blog.csdn.net/weixin_46635575/article/details/121532149 二.分治算法:https:// ...

  3. 佛洛依德算法求最短路径实例

    佛洛依德算法求最短路径实例 #include <iostream> #include <string.h> #include <stdlib.h> #include ...

  4. 佛洛依德算法C语言简单实现

    计算图中每个顶点间的最短路径及路径长度 采用邻接矩阵表示图 代码如下: #include <stdio.h> #include <windows.h> #include < ...

  5. 迪杰斯特拉算法与佛洛依德算法

    迪杰斯特拉算法用于计算:某点v0到其他所有点的最短路径,时间复杂度为O(n^2) 初态: 设定V为所有顶点的集合. 设定S为已经得到的最短路径的顶点vi的集合.即S中的顶点vi,都是已经确定下来v0到 ...

  6. 推免复习之数据结构与算法 佛洛依德算法

    佛洛依德算法算法作为一个经典的求最短路径的算法,思路其实很简单,就是不停地进行"松弛操作",直到全部遍历一遍.那么什么是松弛操作呢?比如说我们的图存在一个邻接矩阵graph中,gr ...

  7. 佛洛依德算法求最短路径(记录路径信息)

    佛洛依德算法: 利用D矩阵拿到邻接矩阵中的权值.path矩阵记录两点之间的移动中转点(初始值为起点). 对于邻接矩阵中 i 到 j 点的权值进行比较,若加上一个中转点 k 后的权值小于原本的权值,则对 ...

  8. Java实现佛洛依德算法(floyd)的完整代码

    Java实现佛洛依德算法(floyd)的完整代码 /*** 弗洛伊德(floyd)算法求图中所有点对之间的最短路径:* 其中'-1'表示两点之间目前还没有联通的路径:* 结论:如果A点到G点之间有最短 ...

  9. 算法与数据结构学习(58)-程序员常用10种算法(佛洛依德算法)

    弗洛伊德(Floyd)算法介绍 和Dijkstra算法一样,弗洛伊德(Floyd)算法也是一种用于寻找给定的加权图中顶点间最短路径的算法.该算法名称以创始人之一.1978年图灵奖获得者.斯坦福大学计算 ...

最新文章

  1. 技术图文:如何通过 LINQ 查找集合中的重复数据?
  2. 敏捷结果30天之第六天:周五回顾,找到三件做的好以及三件需要改善的事情...
  3. 为什么机器人企业的算法工程师需要ROS开发经验
  4. 【数据库】Mysql日期/时间函数实际案例
  5. MTK A/B system说明及配置
  6. spark报错: Yarn application has already ended! killed or unable to launch application master
  7. 事故频发,自动驾驶技术该何去何从?
  8. Second Highest Salary --leetCode
  9. java+基于dom4j工具类_基于dom4j的xml映射实体的工具类(java)
  10. dojo省份地市级联之地市封装类(二)
  11. 如何使用一键回录游戏视频
  12. 超大源码库使用git clone --mirror克隆远程代码制作镜像失败的处理办法
  13. 服务器3D场景建模(五):体素场景(三)
  14. 钢琴网页制作教程_钢琴
  15. 【读书】2020年阅读记录
  16. html表格制作步骤详解,HTML网页表单制作详细讲解
  17. python将doc文件转换docx
  18. 24 款效率办公神器,简直不要太强大!
  19. Android系统之Mtk开机logo镜像单独制作(不用全编译代码)
  20. 从零开始Android游戏编程(第二版) 目录

热门文章

  1. 结构体中函数指针初始化
  2. date-fns时间库由浅入深
  3. 使用selenium模块控制谷歌浏览器报错
  4. SQLServer_where添加类似ifelse条件(casewhen)
  5. 无线产品标准有哪几种?它们各具有什么特征?
  6. 使用MoveIt!控制Gazebo仿真环境中的UR 10机械臂
  7. 教育部办公厅关于印发《全国职业院校技能大赛执行规划(2023—2027年)》的通知
  8. 脉冲matlab,matlab脉冲发生器 脉冲发生器matlab程序.doc
  9. IP地址、子网掩码和网关的理解
  10. 音乐api搭建php音乐下载,百度音乐api接口