弗洛伊德算法(Floyd)简介

Floyd算法适用于解决求最短路径问题,相比于Digkstra算法思路更加简单,更容易理解,但是效率会明显低很多,可以作为初步学习的一种方法。

目录

  • 弗洛伊德算法(Floyd)简介
  • 主要思想
    • 具体步骤
      • 具体例题
        • 输出最短路径

主要思想

主要的想法就是创建一个矩阵用于记录最短距离,如果需要求最短距离的路径的话则需要创建另外一个矩阵用于记录路径,矩阵中放置中介点即可。

具体步骤

1.在主函数中创建一个矩阵,存储输入的两点间的距离。
2.在Floyd函数中,初始化记录最短距离的矩阵和记录中介点的矩阵。初始化之后将主函数的矩阵复制给记录最短距离的矩阵。
3.用三层循环不断更新最短距离。
以上仅为简要介绍,具体过程结合实例介绍。

具体例题

Problem Description:
某省自从实行了很多年的畅通工程计划后,终于修建了很多路。不过路多了也不好,每次要从一个城镇到另一个城镇时,都有许多种道路方案可以选择,而某些方案要比另一些方案行走的距离要短很多。这让行人很困扰。

现在,已知起点和终点,请你计算出要从起点到终点,最短需要行走多少距离。

Input
本题目包含多组数据,请处理到文件结束。
每组数据第一行包含两个正整数N和M(0<N<200,0<M<1000),分别代表现有城镇的数目和已修建的道路的数目。城镇分别以0~N-1编号。
接下来是M行道路信息。每一行有三个整数A,B,X(0<=A,B<N,A!=B,0<X<10000),表示城镇A和城镇B之间有一条长度为X的双向道路。
再接下一行有两个整数S,T(0<=S,T<N),分别代表起点和终点。

Output
对于每组数据,请在一行里输出最短需要行走的距离。如果不存在从S到T的路线,就输出-1.

Sample Input
3 3
0 1 1
0 2 3
1 2 1
0 2
3 1
0 1 1
1 2

Sample Output
2
-1

#include<iostream>using namespace std;#define MAXN 200
#define INF 10000000class Path
{public:int vexnum;       //点的个数 int edgnum;       //边数 int matirx[MAXN][MAXN];      //点间的距离
};int D[MAXN][MAXN];void Floyd(Path G)
{int v, w, k;//初始化floyd算法的矩阵 for(v = 0; v < G.vexnum; v++){for(w = 0; w < G.vexnum; w++){D[v][w] = G.matirx[v][w];}}for(k = 0; k < G.vexnum; k++){for(v = 0; v < G.vexnum; v++){for(w = 0; w < G.vexnum; w++){if(D[v][w] > (D[v][k] + D[k][w])){D[v][w] = D[v][k] + D[k][w];//更新最小路径 }}}}
}int main()
{int N, M;while(~scanf("%d%d",&N,&M)){Path G;G.vexnum = N;G.edgnum = M;for(int i = 0; i < N; i++){for(int j = 0; j < N; j++){if(i == j)G.matirx[i][j] = 0;elseG.matirx[i][j] = INF;}}int s,e,l;for(int i = 0; i < M; i++){cin >> s >> e >> l;if(G.matirx[s][e] > l){G.matirx[s][e] = l;G.matirx[e][s] = l; }}Floyd(G);int st, en;cin >> st >> en;if(D[st][en] >= INF)cout << -1 << endl;elsecout << D[st][en] << endl;}return 0;
}

该代码主要有以下几个部分:
1.这个类用于储存了点的个数,输入边的条数,以及各点间的距离。这里当然可以不使用类,直接使用全局变量也可以!

2.
这个主函数中的类负责记录输入的所有信息。第一个for循环用于初始化矩阵,同一个点的距离是0,其它的则是无限大(相对于出现的数据)。第二个for循环用于记录输入的点间的距离,输入时需判断是否为两点间最短的距离,因为两点间的路径可能不止一条。

3.
该部分首先将主函数中的矩阵复制给D矩阵。三重循环中,k代表的是中介点,v是起点,w是终点,三重循环足以遍历所有的情况,并完善矩阵。则各点间的距离全部记录在D矩阵中,没有路径到达的两点间的距离是无穷大。

当然,以上仅为求出最短距离,路径则需要另外加上一个记录中介点的矩阵。 详见下解。

输出最短路径

#include<iostream>using namespace std;#define MAXN 200
#define INF 10000000class Path
{public:int vexnum;       //点的个数 int edgnum;       //边数 int matirx[MAXN][MAXN];      //点间的距离
};int D[MAXN][MAXN];
int P[MAXN][MAXN];       //新加入的矩阵用于记录中介点void Floyd(Path G)
{int v, w, k;//初始化floyd算法的两个矩阵 for(v = 0; v < G.vexnum; v++){for(w = 0; w < G.vexnum; w++){D[v][w] = G.matirx[v][w];P[v][w] = w;        //中介点的初始化}}for(k = 0; k < G.vexnum; k++){for(v = 0; v < G.vexnum; v++){for(w = 0; w < G.vexnum; w++){if(D[v][w] > (D[v][k] + D[k][w])){D[v][w] = D[v][k] + D[k][w];//更新最小路径 P[v][w] = k;                //更新中介点}}}}
}void PP(int v, int w)         //路径输出函数
{while( P[v][w] != w){PP(v,P[v][w]);cout << P[v][w] << "->" ;return;}return;
}int main()
{int N, M;while(~scanf("%d%d",&N,&M)){Path G;G.vexnum = N;G.edgnum = M;for(int i = 0; i < N; i++){for(int j = 0; j < N; j++){if(i == j)G.matirx[i][j] = 0;elseG.matirx[i][j] = INF;}}int s,e,l;for(int i = 0; i < M; i++){cin >> s >> e >> l;if(G.matirx[s][e] > l){G.matirx[s][e] = l;G.matirx[e][s] = l; }}Floyd(G);int st, en;cin >> st >> en;if(D[st][en] >= INF)cout << -1 << endl;else{cout << D[st][en] << endl;cout << st << "->";PP(st,en);cout << en << endl;}    }return 0;
}

可见,上述代码中的变化是多了一个矩阵并且初始化了中介点,在更新最短路径的同时更新中介点。另外便是用递归输出了路径的中间过程,但要注意首尾需要自己加上。

弗洛伊德算法(Floyd)简介相关推荐

  1. 最短路径三大算法——1,弗洛伊德算法floyd(复杂度O(n^3))

    目前已经更新: 1,弗洛伊德算法floyd(复杂度O(n^3)) 2,迪杰斯特拉算法dijkstra (复杂度O(最坏n^2)) 3,SPFA算法(复杂度O(n*m)) 当然,最短路径有通用的bfs, ...

  2. 最短路径算法——清晰简单的弗洛伊德算法(Floyd)

    弗洛伊德算法(Floyd) \qquad 上一篇文章介绍了迪杰斯特拉算法(Dijkstra).具体请看:最短路径算法--简单明了的迪杰斯特拉算法(Dijkstra).Dijkstra适用于非负权图,并 ...

  3. 弗洛伊德算法Floyd

    全知识整理目录 数据结构整理的目录包括了许多的数据结构相关知识. 目录 概述 算法过程 关键代码的实现 总结 参考 概述 Floyd算法是什么? Floyd算法也是动态规划的求最短路径,但不同于Dij ...

  4. 弗洛伊德算法c语言path,Floyd算法(弗洛伊德算法)

    算法描述: Floyd算法又称为弗洛伊德算法,插点法,是一种用于寻找给定的加权图中顶点间最短路径的算法.从图的带权邻接矩阵A=[a(i,j)] n×n开始,递归地进行n次更新,即由矩阵D(0)=A,按 ...

  5. 弗洛伊德(Floyd)算法之两点之间的最短距离问题

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

  6. 弗洛伊德算法_弗洛伊德算法

    前面Dijkstra算法和Bellman-Ford算法解决了单源最短路径问题,但是如果需要获取图中任意两顶点的最短距离呢?我们可以使用前面两个算法我们可以遍历每个顶点得到每个顶点的单源最短距离,但是最 ...

  7. 【算法】弗洛伊德算法 最短路径算法

    文章目录 1.概述 2.图解 2.1 图示 2.2 弗洛伊德算法的步骤: 3.代码 1.概述 弗洛伊德(Floyd)算法介绍 和Dijkstra算法一 样,弗洛伊德(Floyd)算法也是一种用 于寻找 ...

  8. 弗洛伊德算法学习(Java)

    弗洛伊德算法学习(Java) 学习视频:尚硅谷韩老师java讲解数据结构和算法 一. 弗洛伊德(Floyd)算法介绍 和 Dijkstra 算法一样,弗洛伊德(Floyd)算法也是一种用于寻找给定的加 ...

  9. 算法之弗洛伊德(Floyd)算法

    简介: Floyd算法又称为插点法,是一种利用动态规划的思想寻找给定的加权图中多源点之间最短路径的算法,与Dijkstra算法类似.该算法名称以创始人之一.1978年图灵奖获得者.斯坦福大学计算机科学 ...

最新文章

  1. wex5 转换 html5,WeX5开发工具(html5 app开发框架)V3.9 开源版
  2. windows2003下防火墙ISA大型实验
  3. 1055 最长等差数列
  4. vue-beauty UI库
  5. HTTP Get Post
  6. python学习笔记2018-9-18
  7. 笨办法学 Python · 续 练习 20:二叉搜索树
  8. java jodd_Jodd :一款优雅的 Java 工具集
  9. 养成女友?我训练出了一个“杨超越”聊天机器人
  10. Could not find a declaration file for module 'vue-xxx'.
  11. 专转本-矩阵的初等变换与线性方程组
  12. 如何制作专属的VS Code主题
  13. 【软件安装】vmware虚拟机安装完整教程(15.5版本)
  14. DES算法和MAC算法总结
  15. 《前端技巧》清理微信浏览网站的缓存,Cookie
  16. onfouce事件与onblur事件
  17. asp毕业设计——基于asp+sqlserver的网上选课系统设计与实现(毕业论文+程序源码)——网上选课系统
  18. java小游戏之飞机大战
  19. 超详细|一篇搞定操作系统——用户接口
  20. 应用于Web的TWAIN扫描识别软件-Dynamic Web TWAIN

热门文章

  1. 匹配算法:局部结构保留
  2. Java的IDEA最常用快捷键汇总+快速写出Main函数
  3. centos7 安装 Mysql 5.7.28,详细完整教程
  4. [JS] 闭包与内存泄漏
  5. python random 随机生成一个数
  6. 中国顶级黑客45秒使用声音来破坏您的计算机
  7. 浙江大学数学专业考研试题参考解答
  8. django基础(一)
  9. Java 设计模式_代理模式(2016-08-19)
  10. 对输入框以及选择框集体的数据检验