Java实现之弗洛伊德(Floyd)算法
一.问题引入
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)算法相关推荐
- Java迪杰斯特拉(Dijkstra)算法与弗洛伊德(Floyd)算法
1.Java迪杰斯特拉(Dijkstra)算法与弗洛伊德(Floyd)算法 1.1 迪杰斯特拉(Dijkstra)算法 1.1.1 迪杰斯特拉(Dijkstra)算法介绍 迪杰斯特拉(Dijkstra ...
- 算法其实很简单—弗洛伊德(Floyd)算法
目录 1.弗洛伊德(Floyd)算法介绍 2.弗洛伊德(Floyd)算法最佳应用-最短路径 3.弗洛伊德(Floyd)算法图解分析 3.1 弗洛伊德算法的步骤: 4.代码实现 1.弗洛伊德(Floyd ...
- 060.弗洛伊德(Floyd)算法的原理以及解决最短路径问题
1. 弗洛伊德(Floyd)算法的原理 1.1. 基本介绍 1.1.1. 弗洛伊德算法和迪杰斯特拉算法比较 1.2. 算法步骤 1.3. 步骤图解 1.3.1. 第一轮循环 1.3.2. 找出每个点作 ...
- 数据结构与算法(7-4)最短路径(迪杰斯特拉(Dijkstra)算法、弗洛伊德(Floyd)算法)
目录 一.最短路径概念 二.迪杰斯特拉(Dijkstra)算法(单源最短路径) 1.原理 2.过程 3.代码 三.弗洛伊德(Floyd)算法(多源最短路径) 1.原理 2.存储 3.遍历 4.代码 参 ...
- 弗洛伊德(Floyd)算法求解图的最短路径
弗洛伊德(Froyd)算法用于求解所有顶点到所有顶点的的最短路径.时间复杂度为O(n^3). 正如我们所知道的,Floyd算法用于求最短路径.Floyd算法可以说是Warshall算法的扩展,三个fo ...
- 【数据结构笔记24】单源最短路(迪克斯拉Dijkstra算法),多源最短路(弗洛伊德Floyd算法)
本次笔记内容: 7.1.1 概述 7.1.2 无权图的单源最短路 7.1.3 有权图的单源最短路 7.1.3-s 有权图的单源最短路示例 7.1.4 多源最短路算法 文章目录 最短路径问题 最短路径问 ...
- 弗洛伊德(Floyd)算法
1.介绍 Floyd-Warshall算法(英语:Floyd-Warshall algorithm),中文亦称弗洛伊德算法或佛洛依德算法,是解决任意两点间的最短路径的一种算法,可以正确处理有向图或负权 ...
- 最短路弗洛伊德(Floyd)算法加保存路径
弗洛伊德算法大致有点像dp的推导 dp[i][j] = min(dp[i][k] + dp[k][j], dp[i][j]), 其中 i 是起始点,j 是终止点.k是它们经过的中途点. 通过这个公式不 ...
- 弗洛伊德算法c语言path,Floyd算法(弗洛伊德算法)
算法描述: Floyd算法又称为弗洛伊德算法,插点法,是一种用于寻找给定的加权图中顶点间最短路径的算法.从图的带权邻接矩阵A=[a(i,j)] n×n开始,递归地进行n次更新,即由矩阵D(0)=A,按 ...
最新文章
- Ubuntu 配置大数据平台hadoop hive数据仓库之完整踩坑
- kaggle账号_Kaggle 数据挖掘比赛经验分享
- c c++ 函数内数组初值_C/C Plus Plus中的函数
- 7-7 念数字 (10 分)
- 逾845.5万枚XRP从币安交易所转入未知钱包,价值超过496万美元
- atoi的实现和 字符指针数组
- 为什么TCP连接不可靠
- size_t 和int 无符号整型和有符号整型
- 编译OpenJDK8:configure: Could not compile and link with freetype. This might be a 32/64-bit mismatch.
- Solaris 11.4安装,映像包管理系统(IPS)搭建
- 创意无价,优化 百度、Bing、Duckduckgo 三大国际搜索引擎
- 高翔视觉slam十四讲书籍习题(第三讲)
- sketch插件导出html,Sketch插件根据命名导出HTML片段Sketch Emmet
- 李时珍编撰《本草纲目》以《证类本草》为蓝本
- PHP字符串常用函数
- uni-app实现仿微信前端(二)
- Directx11进阶教程PBR(3)之IBL
- 礼盒抖动动画(CocosCreator)
- 阿里云ECS服务器部署
- 挖掘行业长尾关键字以及词库的步骤
热门文章
- 《计算机网络》——几种编码形式
- java wait notifyall_Java中的wait/notify/notifyAll
- Hadoop技术内幕:深入解析Hadoop Common和HDFS架构设计与实现原理
- java 以太网_java怎样获取以太网的MAC地址
- Qt 绘图之QGraphicsScene QGraphicsView QGraphicsItem详解
- 收藏:光电开关的 接线
- 【M365运维】- 设定会议室预订的消息推送
- 手机C语言编程软件c4droid试用
- 匠人手记:单片机工作者的实践与思考
- ADODB.Command #x27;800a0bb9#x27; 错误[参数类型不正确,或不在可以接受的范围之内,或与其他参数冲突。]