一.问题引入

1.问题引入

1)胜利乡有7个村庄(A,B,C,D,E,F, G)
2)各个村庄的距离用边线表示(权),比如A-B距离5公里3)问:如何计算出各村庄到其它各村庄的最短距离?

二.基本介绍

1.算法介绍

1)和Dijkstra算法一样弗洛伊德(Floyd)算法也是一种用于寻找给定的加权图中顶点间最短路径的算法。该算法名称以创始人之一、1978年图灵奖获得者、斯坦福大学计算机科学系教授罗伯特·弗洛伊德命名

2)弗洛伊德算法(Floyd)计算图中各个顶点之间的最短路径

3)迪杰斯特拉算法用于计算图中某一个顶点到其他顶点的最短路径。

4)弗洛伊德算法vS迪杰斯特拉算法:迪杰斯特拉算法

通过选定的被访问顶点,求出从出发访问顶点到其他顶点的最短路径;弗洛伊德算法中每一个顶点都是出发访问点,所以需要将每一个顶点看做被访问顶点,求出从每一个顶点到其他顶点的最短路径

2.算法图解

1)设置顶点vi到顶点vk的最短路径已知为Lik,顶点vk到vj的最短路径已知为Lk,顶点vi到vj的路径为Lij,则vi到vj的最短路径为:min((LiR+Lkj),Lij),vk的取值为图中所有顶点,则可获得vi到vj的最短路径
2)至于vi到vk的最短路径Lik或者vk到vj的最短路径lkj,是以同样的方式获得
3)弗洛伊德(Floyd)算法图解分析-举例说明

第一轮循环中,以A(下标为:0)作为中间顶点
【即把A作为中间顶点的所有情况都进行遍历,就会得到更新距离表和前驱关系】,距离表和前驱关系更新为

3.代码实现

public class Floyd {public static final int N = 65535;public static void main(String[] args) {//测试是否创建成功char[] vertex = {'A', 'B', 'C', 'D', 'E', 'F', 'G'};//邻接矩阵int[][] matrix = new int[vertex.length][vertex.length];matrix[0] = new int[]{0, 5, 7, N, N, N, 2};matrix[1] = new int[]{5, 0, N, 9, N, N, 3};matrix[2] = new int[]{7, N, 0, N, 8, N, N};matrix[3] = new int[]{N, 9, N, 0, N, 4, N};matrix[4] = new int[]{N, N, 8, N, 0, 5, 4};matrix[5] = new int[]{N, N, N, 4, 5, 0, 6};matrix[6] = new int[]{2, 3, N, N, 4, 6, 0};Graph graph = new Graph(vertex, matrix);graph.floyd();graph.show();}}class Graph {char[] vertex;  //保存结点的数据int[][] distance; //保存各个顶点到其他顶点的距离,动态变化的int[][] pre;//保存到达目标顶点的前驱顶点public Graph(char[] vertex, int[][] distance) {this.vertex = vertex;this.distance = distance;this.pre = new int[vertex.length][vertex.length];//对pre顶点进行初始化,存放的前驱顶点的下标for (int i = 0; i < vertex.length; i++) {Arrays.fill(pre[i], i);}}public void show() {//显示distance数组for (int i = 0; i < distance.length; i++) {for (int j = 0; j < distance[i].length; j++) {System.out.printf("%-8d", distance[i][j]);}System.out.println();}//显示pre数组for (int i = 0; i < pre.length; i++) {for (int j = 0; j < pre[i].length; j++) {System.out.print(vertex[pre[i][j]] + "  ");}System.out.println();}}//佛洛依德算法public void floyd() {int len = 0;for (int k = 0; k < distance.length; k++) {//中间顶点的遍历for (int i = 0; i < distance.length; i++) {//出发顶点的遍历for (int j = 0; j < distance.length; j++) {//到达顶点的遍历len = distance[i][k] + distance[k][j];if (len < distance[i][j]) {//如果len小于直连的距离,更新距离distance[i][j] = len;pre[i][j] = pre[k][j];}}}}}
}

Java实现之弗洛伊德(Floyd)算法相关推荐

  1. Java迪杰斯特拉(Dijkstra)算法与弗洛伊德(Floyd)算法

    1.Java迪杰斯特拉(Dijkstra)算法与弗洛伊德(Floyd)算法 1.1 迪杰斯特拉(Dijkstra)算法 1.1.1 迪杰斯特拉(Dijkstra)算法介绍 迪杰斯特拉(Dijkstra ...

  2. 算法其实很简单—弗洛伊德(Floyd)算法

    目录 1.弗洛伊德(Floyd)算法介绍 2.弗洛伊德(Floyd)算法最佳应用-最短路径 3.弗洛伊德(Floyd)算法图解分析 3.1 弗洛伊德算法的步骤: 4.代码实现 1.弗洛伊德(Floyd ...

  3. 060.弗洛伊德(Floyd)算法的原理以及解决最短路径问题

    1. 弗洛伊德(Floyd)算法的原理 1.1. 基本介绍 1.1.1. 弗洛伊德算法和迪杰斯特拉算法比较 1.2. 算法步骤 1.3. 步骤图解 1.3.1. 第一轮循环 1.3.2. 找出每个点作 ...

  4. 数据结构与算法(7-4)最短路径(迪杰斯特拉(Dijkstra)算法、弗洛伊德(Floyd)算法)

    目录 一.最短路径概念 二.迪杰斯特拉(Dijkstra)算法(单源最短路径) 1.原理 2.过程 3.代码 三.弗洛伊德(Floyd)算法(多源最短路径) 1.原理 2.存储 3.遍历 4.代码 参 ...

  5. 弗洛伊德(Floyd)算法求解图的最短路径

    弗洛伊德(Froyd)算法用于求解所有顶点到所有顶点的的最短路径.时间复杂度为O(n^3). 正如我们所知道的,Floyd算法用于求最短路径.Floyd算法可以说是Warshall算法的扩展,三个fo ...

  6. 【数据结构笔记24】单源最短路(迪克斯拉Dijkstra算法),多源最短路(弗洛伊德Floyd算法)

    本次笔记内容: 7.1.1 概述 7.1.2 无权图的单源最短路 7.1.3 有权图的单源最短路 7.1.3-s 有权图的单源最短路示例 7.1.4 多源最短路算法 文章目录 最短路径问题 最短路径问 ...

  7. 弗洛伊德(Floyd)算法

    1.介绍 Floyd-Warshall算法(英语:Floyd-Warshall algorithm),中文亦称弗洛伊德算法或佛洛依德算法,是解决任意两点间的最短路径的一种算法,可以正确处理有向图或负权 ...

  8. 最短路弗洛伊德(Floyd)算法加保存路径

    弗洛伊德算法大致有点像dp的推导 dp[i][j] = min(dp[i][k] + dp[k][j], dp[i][j]), 其中 i 是起始点,j 是终止点.k是它们经过的中途点. 通过这个公式不 ...

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

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

最新文章

  1. Ubuntu 配置大数据平台hadoop hive数据仓库之完整踩坑
  2. kaggle账号_Kaggle 数据挖掘比赛经验分享
  3. c c++ 函数内数组初值_C/C Plus Plus中的函数
  4. 7-7 念数字 (10 分)
  5. 逾845.5万枚XRP从币安交易所转入未知钱包,价值超过496万美元
  6. atoi的实现和 字符指针数组
  7. 为什么TCP连接不可靠
  8. size_t 和int 无符号整型和有符号整型
  9. 编译OpenJDK8:configure: Could not compile and link with freetype. This might be a 32/64-bit mismatch.
  10. Solaris 11.4安装,映像包管理系统(IPS)搭建
  11. 创意无价,优化 百度、Bing、Duckduckgo 三大国际搜索引擎
  12. 高翔视觉slam十四讲书籍习题(第三讲)
  13. sketch插件导出html,Sketch插件根据命名导出HTML片段Sketch Emmet
  14. 李时珍编撰《本草纲目》以《证类本草》为蓝本
  15. PHP字符串常用函数
  16. uni-app实现仿微信前端(二)
  17. Directx11进阶教程PBR(3)之IBL
  18. 礼盒抖动动画(CocosCreator)
  19. 阿里云ECS服务器部署
  20. 挖掘行业长尾关键字以及词库的步骤

热门文章

  1. 《计算机网络》——几种编码形式
  2. java wait notifyall_Java中的wait/notify/notifyAll
  3. Hadoop技术内幕:深入解析Hadoop Common和HDFS架构设计与实现原理
  4. java 以太网_java怎样获取以太网的MAC地址
  5. Qt 绘图之QGraphicsScene QGraphicsView QGraphicsItem详解
  6. 收藏:光电开关的 接线
  7. 【M365运维】- 设定会议室预订的消息推送
  8. 手机C语言编程软件c4droid试用
  9. 匠人手记:单片机工作者的实践与思考
  10. ADODB.Command #x27;800a0bb9#x27; 错误[参数类型不正确,或不在可以接受的范围之内,或与其他参数冲突。]