弗洛伊德(Floyd)算法介绍

  1. 和Dijkstra算法一样,弗洛伊德(Floyd)算法也是一种用于寻找给定的加权图中顶点间最短路径的算法。该算法名称以创始人之一、1978年图灵奖获得者、斯坦福大学计算机科学系教授罗伯特·弗洛伊德命名
  2. 弗洛伊德算法(Floyd)计算图中各个顶点之间的最短路径
  3. 迪杰斯特拉算法用于计算图中某一个顶点到其他顶点的最短路径。
  4. 弗洛伊德算法 VS 迪杰斯特拉算法:迪杰斯特拉算法通过选定的被访问顶点,求出从出发访问顶点到其他顶点的最短路径;弗洛伊德算法中每一个顶点都是出发访问点,所以需要将每一个顶点看做被访问顶点,求出从每一个顶点到其他顶点的最短路径。

弗洛伊德(Floyd)算法图解分析

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

弗洛伊德(Floyd)算法最佳应用-最短路径

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

图解

代码实现

package floyd;import java.util.Arrays;public class floydAlgorithm {public static void main(String[] args) {//测试看看图是否创建成功char[] vertex = {'A', 'B', 'C', 'D', 'E', 'F', 'D'};int[][] matrix = new int[vertex.length][vertex.length];final int N = 65535;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.length, matrix, vertex);// 调用弗洛伊德算法graph.floyd();graph.show();}
}class Graph {private char[] vertex;  // 存放顶点数组private int[][] dis;    // 保存从各个顶点出发到其他顶点的距离,最后的结果,也是保存在该数组private int[][] pre;    // 保存到达目标顶点的前驱结点/*** 构造器** @param length 长度大小* @param matrix 初始邻接矩阵* @param vertex 顶点数组*/public Graph(int length, int[][] matrix, char[] vertex) {this.vertex = vertex;this.dis = matrix;this.pre = new int[length][length];// 对pre数组初始化,存的的是for (int i = 0; i < length; i++) {Arrays.fill(pre[i], i);}}// 显示pre数组和dis数组{public void show() {// 为了显示便于阅读char[] vertex = {'A', 'B', 'C', 'D', 'E', 'F', 'D'};for (int i = 0; i < dis.length; i++) {// 先将pr数组输出for (int j = 0; j < dis.length; j++) {System.out.print(vertex[pre[i][j]] + " ");}System.out.println();// 将dist组输出for (int j = 0; j < dis.length; j++) {System.out.print("(" + vertex[i] + "到" + vertex[j] + "的最短路径是:" + dis[i][j] + ") ");}System.out.println();System.out.println();}}public void floyd() {int len = 0;    // 记录变量保存距离// 对中间顶点遍历,k就是中间顶点的下标 ['A','B','C','D','E','F','G']for (int k = 0; k < dis.length; k++) {// 从i顶点开始出发 ['A','B','C','D','E','F','G']for (int i = 0; i < dis.length; i++) {// 到达j顶点,['A','B','C','D','E','F','G']for (int j = 0; j < dis.length; j++) {len = dis[i][k] + dis[k][j];    // => 求出从i顶点出发,经过k中间顶点,到达j顶点距离if (len < dis[i][j]) {  // 如果len小于dis[i][j]dis[i][j] = len;    // 更新距离pre[i][j] = pre[k][j];  // 更新前驱结点}}}}}
}

Java编程:弗洛伊德算法(无向图所有顶点最小路径)相关推荐

  1. Java之弗洛伊德算法

    创建图及弗洛伊德核心算法 public class Graph {private char[] vertex;//存放顶点的数组private int[][] dis;//保存,从各个顶点出发到其他顶 ...

  2. 最短路径之Floyd(弗洛伊德)算法,以及显示完整路径

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

  3. 【常见笔试面试算法题12续集二】动态规划算法案例2矩阵最小路径和练习题

    加qq1126137994 一起学习更多技术!!! 有一个矩阵map,它每个格子有一个权值.从左上角的格子开始每次只能向右或者向下走,最后到达右下角的位置,路径上所有的数字累加起来就是路径和,返回所有 ...

  4. 【Java语言】力扣系列----64. 最小路径和

    给定一个包含非负整数的 m x n 网格,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小. 说明:每次只能向下或者向右移动一步. 示例:输入: [[1,3,1],[1,5,1],[4,2 ...

  5. java编程要求算法吗_JAVA编程

    1. Java是什么样的语言? 答:Java语言是一门用途广泛的.面向对象的语言.Java语言可以编写桌面应用.手机应用及企业应用.Java简洁优雅,易于学习. 2. 没有学过编程,能学吗? 答:本课 ...

  6. java编程贪心算法背包问题,贪心算法----部分背包问题(java实现)

    部分背包问题 给定 n 种物品和一个背包.物品 i 的重量是 Wi,其价值为 Vi,背包的容量为 C.在选择物品 i 装入背包时,可以选择物品 i 的一部分,1<= i <=n.问应如何选 ...

  7. java编程必用软件(有下载路径)

    sts-4.3.2.RELEASE 链接:https://pan.baidu.com/s/1-wywkL1VuV8oBnxhdw_gSQ 提取码:f2ti apache-tomcat-8.5.34 链 ...

  8. java 大整数编程_Java编程--RSA算法中的大整数运算

    Java编程–RSA算法中的大整数运算 RSA原理浅析 RSA是利用陷门单向函数实现的,其安全基础依赖于大整数的分解问题的难解性 算法过程 为了加深对RSA算法的了解,接下来通过简单的一个例子来分析一 ...

  9. DV、LS路由算法Java编程实现

    1. 在500*500的场景中,随机生成N(可设置)个节点(节点坐标x, y):考虑节点的信号覆盖半径为R(可设置):如果两个节点之间的欧氏距离小于等于R,则认为这两个节点可以直接通信(有一条直接相连 ...

  10. 有n 个长为m+1 的字符串,求前后m个字符匹配所能形成的最长字符串链:利用弗洛伊德算法求最长路径...

    有n 个长为m+1 的字符串,如果某个字符串的最后m 个字符与某个字符串的前m 个字符匹配,则两个字符串可以联接,问这n 个字符串最多可以连成一个多长的字符串,如果出现循环,则返回错误. 把字符串看成 ...

最新文章

  1. 机器学习、数据挖掘及其他
  2. python输入数字翻译成星期几-Python练习笔记——计算输入日期为改年的第几天、星期几...
  3. pandas的自带数据集_盘点 | Python自带的那些数据集
  4. Delphi XE2 之 FireMonkey 入门(2)
  5. python全局变量在程序执行的全过程有效_PYTHON使每个过程都可以访问全局变量
  6. linux的initrd.img的解压和打包
  7. 统计学习方法笔记(李航)———第二章(感知机)
  8. 博文视点读书节第八日丨大咖书单升级放送,今日直播助你成为Offer收割机~晒单赢福袋正在派送中!
  9. Excel 取消身份证的科学计数法显示形式
  10. SpringBoot整合RabbitMQ之Fanout Exchange扇形(广播式)交换机(学习总结)
  11. day6Linux命令-设置别名
  12. linux安装jdk8
  13. 希尔伯特变换产生负频率解决方法
  14. 飘动图片广告html代码,基于JavaScript代码实现随机漂浮图片广告
  15. 基于java的智能计算器_基于Java的语音计算器实现
  16. 红黑二叉树详解及理论分析
  17. Git配置详细教程及基础使用方法,教你轻松学会git代码管理
  18. win10计算机怎么新增用户,win10 如何添加管理员账户_win10 添加管理员账户方法-win7之家...
  19. 2020风中劲草pdf电子版完整版 下载
  20. 计算机基本原理——CPU的结构与原理

热门文章

  1. 25.go doc 与 godoc
  2. 21.Linux/Unix 系统编程手册(上) -- 信号:信号处理器函数
  3. 跨域资源共享(CORS)-漏洞整理
  4. Centos 部署.net Core
  5. 【语言学习】Java
  6. 报表性能优化方案之行引擎执行层式报表
  7. mysql语句中出现中文的情况下,在java程序中不会有结果,也不会报错.
  8. express 设置handlebars模板引擎
  9. 青龙面板实现 G D O S 每日自动签到
  10. parse data from Nacos error