1.概述

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

2.弗洛伊德(Floyd)算法 与 迪杰斯特拉(Dijkstra)算法 的区别

(1) 弗洛伊德(Floyd)算法:图中的每一个顶点都是出发顶点,需要求出每一个被看成为出发顶点的顶点到其他顶点的最短路径
(2)迪杰斯特拉(Dijkstra)算法:选定图中某一个顶点作为出发顶点,求出出发顶点到其他顶点的最短路径

3.弗洛伊德(Floyd)算法基本思路

(1)设置 i 为出发顶点,k 为中间顶点,j 为其他顶点
(2)设置顶点 vi 到顶点 vk 的最短路径已知为 Lik,顶点 vk 到 vj 的最短路径已知为 Lkj,顶点 vi 到 vj 的路径为 Lij,则 vi 到 vj 的最短路径为:min((Lik+Lkj),Lij),vk 的取值为图中所有顶点,则可获得 vi 到 vj 的最短路径

(3)三层 for 循环解决问题

4.代码实现

package com.zzb.algorithm.floyd;import java.io.Serializable;
import java.util.Arrays;/*** @Auther: Administrator* @Date: 2020/3/30 14:46* @Description: 弗洛伊德算法*/
public class Floyd {public static void main(String[] args) {// 顶点值数组String[] vertexArray = {"A", "B", "C", "D", "E", "F", "G"};// 邻接矩阵final int N = Integer.MAX_VALUE/2; // 表示不可以连接int[][] matrix = new int[vertexArray.length][vertexArray.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(vertexArray, matrix);// 详细展示最短距离数据graph.showDistanceDetail();}
}/*** 图类*/
class Graph implements Serializable {private static final long serialVersionUID = -4402590218398745596L;// 存储图中各个顶点的集合private String[] vertexArray;// 存储图中各条边的邻接矩阵,也作为保存各个顶点作为出发顶点到其他顶点的最短距离的数组private int[][] edgeArray;// 存储各个顶点的前驱顶点,即通过哪个顶点到达该顶点private int[][] pre;/*** 构造器初始化* @param vertexArray 顶点集合* @param edgeArray 边集合*/public Graph(String[] vertexArray, int[][] edgeArray) {this.vertexArray = vertexArray;this.edgeArray = edgeArray;// 初始化其他顶点的前驱顶点// A->A,A->B,A->C,A->D,A->E,A->F,A->G// A,B,C,D,E,F,G 的前驱顶点都初始化为A// B->A,B->B,B->C,B->D,B->E,B->F,B->G// A,B,C,D,E,F,G 的前驱顶点都初始化为B// ...如此类推,用对应索引 i 来表示前驱顶点this.pre = new int[this.edgeArray.length][this.edgeArray[0].length];for(int i = 0; i < this.vertexArray.length; i++) {Arrays.fill(pre[i],i);}}/*** 弗洛伊德算法*/private void floyd() {// 中间顶点for(int k = 0; k < this.vertexArray.length; k++) {// 被看成为出发点的每一个顶点for(int i = 0; i < this.vertexArray.length; i++) {// 其他顶点for(int j = 0; j < this.vertexArray.length; j++) {if(this.edgeArray[i][k] + this.edgeArray[k][j] < this.edgeArray[i][j]) {// 更新出发点到其他顶点的最短距离this.edgeArray[i][j] = this.edgeArray[i][k] + this.edgeArray[k][j];// 更新 j 的前驱顶点this.pre[i][j] = this.pre[k][j];}}}}}/*** 详细展示最短距离数据*/public void showDistanceDetail() {// 弗洛伊德算法floyd();// 后续处理,详细展示最短距离数据int tempIndex;String tempStr = "";// 最短距离数组for(int i = 0; i < this.vertexArray.length; i++) {for(int j = 0; j < this.vertexArray.length; j++) {// 比如,A(i)->D(j) 的最短距离所走过的顶点分析,看上面的图来分析,如下:// (1)找到A(i)->D(j)的前驱为F(5),pre[i][tempIndex] == 5,// (2)再找A(i)->F(5)的前驱为G(6),pre[i][tempIndex] == 6,// (3)再找到A(i)->G(6)前驱为A(i),pre[i][tempIndex] == 1,// (4)前驱为 i(即出发顶点的下标索引) ,终止路径寻找,得到两点之间最短距离所走过的顶点tempIndex = j;while(this.pre[i][tempIndex] != i) {tempIndex = this.pre[i][tempIndex];tempStr = this.vertexArray[tempIndex] + "->" + tempStr;}// 拼接tempStr = this.vertexArray[i] + "->" + tempStr + this.vertexArray[j];System.out.print(this.vertexArray[i] + "到" + this.vertexArray[j] + "的最短距离为" + this.edgeArray[i][j]+ "(" + tempStr + ")" + "\t\t\t\t" + "| ");// 清空tempStr = "";}System.out.println();}}
}

5.代码运行的最终结果(点击放大查看)

弗洛伊德(Floyd)算法之两点之间的最短距离问题相关推荐

  1. 迪杰斯特拉(Dijkstra)算法之两点之间的最短距离问题

    1.概述 (1)与弗洛伊德(Floyd)算法一样,迪杰斯特拉(Dijkstra)算法也是一种用于寻找给定的加权图中顶点间最短路径的算法,主要特点是以出发点为中心向外层层扩展(广度优先搜索思想),直到扩 ...

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

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

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

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

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

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

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

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

  6. Java实现之弗洛伊德(Floyd)算法

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

  7. 两点之间的最短距离是?

    两点之间的最短距离是直线吗?现实告诉我们两点之间的最段距离是阻力最小的路:) "世事洞明皆学问,人情练达即文章" 转载于:https://www.cnblogs.com/Maste ...

  8. Dijkstra最短路由算法,求任意两点之间的最短距离【Java】

    一.问题 求下图中节点0到节点5之间的最短距离 二.方法 Dijkstra最短路由算法.本文不再赘述,直接上代码,如果不懂,可以参考 文章 三.代码 public class MyDijkstra { ...

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

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

最新文章

  1. 关于sql和MySQL的语句执行顺序
  2. Docker(四):Docker 三剑客之 Docker Compose
  3. mysql六:索引原理与慢查询优化
  4. Spring实战6-利用Spring和JDBC访问数据库
  5. python----面对对象三大特征2
  6. html模块殃射,【Web前端问题】webpack打包后,module模块中的函数无法在html标签的事件中调用?...
  7. 《VMware vSphere 6.5企业运维实战》已经出版
  8. react hooks使用_我如何使用React Hooks在约100行代码中构建异步表单验证库
  9. 大道至简 读后有感
  10. mysql数据库的函数_详解数据库_MySQL: mysql函数
  11. Flutter基础—绘画效果之装饰容器
  12. Javascript第五章切换层效果、复选框的全选十三课
  13. 算法 之 栈的简单讲解
  14. poj 1287 Networking prim最小生成树 基础!!!
  15. 2021年ARINC818数字视频传输重磅新品–Helios
  16. 阿里网盘rar再打包分享工具
  17. APP设计之启动页和广告页
  18. 我喜欢这首歌......
  19. redis数据库正确用法
  20. Linux磁盘分区与LVM详解

热门文章

  1. 被 GitHub 「临时邮箱」项目拉黑,Firefox Relay 引热议;业内首个开源容器安全平台发布;Deepin 20.4 发布 | 开源日报
  2. 4.19 数椟科技远程面试 + 粉笔
  3. 文字折叠特效 html+css
  4. 北航软件测评中心 招聘FPGA测试工程师
  5. 闽南师范大学基础计算机教学部,闽南师范大学计算机基础教学部.doc
  6. 批处理 bat cmd 命令大全
  7. LINEST函数根据上半年产品销售量预算指定月份的销售量
  8. 语法分析--自上而下分析的基本问题
  9. 编译原理 --- 语法分析概念,自上而下分析面临的问题以及如何消除左递归问题
  10. LSF_安装(UNIX or Linux)