目录

  • 第8章弗洛伊德算法
    • 8.1算法介绍
    • 8.2 算法图解
    • 8.3 应用场景
    • 8.4 代码实现
    • 本次弗洛伊德算法算法 的教程出自韩顺平的数据结构与算法

第8章弗洛伊德算法

8.1算法介绍

弗洛伊德(Floyd)算法

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

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

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

4)弗洛伊德算法与迪杰斯特拉算法的区别:迪杰斯特拉算法通过选定的被访问顶点,求出发访问顶点到其他顶点的最短路径,而弗洛伊德算法中每一个顶点都是出发访问顶点,所以需要将每一个顶点看作被访问顶点,求出从每一个顶点到其他顶点的最短路径

8.2 算法图解

1)设置顶点vi到顶点vk的最短路径已知为Lik,顶点vk到vj的最短路径已知为Lkj,顶点vi到vj的路径为Lij,则vi带vj的最短路径为:min{ Lij, Lik+Lkj},vk的取值为图中所有顶点,则可以获取到vi到vj的最短路径

2)至于vi到vk的最短路径Lik或者vk到vj的最短路径Lkj,是以同样的方式获得

3)图解

弗洛伊德算法的步骤
第一轮循环中,以A(下标为0作为中间顶点【即把A作为中间顶点的全部情况都进行遍历 ,就会得到新的距离表和前驱关系】,

找A相连的顶点,因为只有与A相连,A才能做中间顶点。明显与A相连的顶点有CBG

三层for循环思想

8.3 应用场景

8.4 代码实现

实现步骤:1、创建图  char[]存放顶点数组  int[][] dis 从各个顶点出发到其他顶点的距离  int[][] pre 保存到达目标顶点的前驱顶点   构造器 (int length,int[][] matrix, char[] vertex) //对pre数组初始化,存放的是前驱顶点的下标     显示pre数组和dis数组2、在图类中使用弗洛伊德算法public void floyd(){        int len = 0; //临时变量保存两点的最短距离        //k 是中间顶点,对k遍历        for (int k = 0; k < dis.length; k++) {            //i是出发顶点,对i遍历            for (int i = 0; i < dis.length; i++) {                //j是目的顶点,对j遍历                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]; //更新前驱顶点                    }                }            }        }    }
package com.ldm.floyd;import java.util.Arrays;/*** @author 梁东明* 2022/9/15* 人生建议:看不懂的方法或者类记得CTRL + 点击 看看源码或者注解* 点击setting在Editor 的File and Code Templates 修改*/
public class FloydAlgorithm {public static void main(String[] args) {// 测试看看图是否创建成功char[] vertex = { 'A', 'B', 'C', 'D', 'E', 'F', 'G' };//创建邻接矩阵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 graph = new Graph(vertex.length, matrix, vertex);graph.floyd();graph.show();}
}class Graph{private char[] data; //存放顶点数组private int[][] dis;  //各个顶点到其他顶点的距离private int[][] pre;  //保存到达目的顶点的前驱顶点public Graph(int length, int[][] matrix, char[] vertex) {this.data = 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', 'G' };System.out.println("各个顶点到其他顶点的最短距离");for (int i = 0; i < dis.length; i++) {for (int j = 0; j < dis.length; j++) {System.out.print(dis[i][j] + "\t");}System.out.println();}System.out.println("各个顶点到达目的顶点的前驱顶点");for (int i = 0; i < pre.length; i++) {for (int j = 0; j < pre.length; j++) {System.out.print(vertex[pre[i][j]] + "\t");}System.out.println();}}/*** 弗洛伊德算法实现*/public void floyd(){int len = 0; //临时变量保存两点的最短距离//k 是中间顶点,对k遍历for (int k = 0; k < dis.length; k++) {//i是出发顶点,对i遍历for (int i = 0; i < dis.length; i++) {//j是目的顶点,对j遍历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]; //更新前驱顶点}}}}}
}

本次弗洛伊德算法算法 的教程出自韩顺平的数据结构与算法

数据结构和算法教程,哔哩哔哩详细教程
在 185-188p.

最后,认识一下,我是小白。努力成为一名合格的程序员。期待与你的下次相遇

弗洛伊德算法(Java)相关推荐

  1. 最短路径-弗洛伊德算法的java实现

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

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

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

  3. Java之弗洛伊德算法

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

  4. Java 图的最短路径问题-迪杰斯特拉算法VS弗洛伊德算法

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

  5. 图解最短路径之弗洛伊德算法(Java实现)

    概述 Floyd算法又称为插点法,是一种利用动态规划的思想寻找给定的加权图中多源点之间最短路径的算法,与Dijkstra算法类似.该算法是一种在具有正或负边缘权重(但没有负环)的加权图中找到最短路径的 ...

  6. 弗洛伊德算法(floyd)

    算法背景: 图中的A,B,C,D,E,F,G,代表7个村庄,边上的权值带表两村庄之间的距离,现在要从某一个村庄,例如G村庄,往另外几个村庄送邮件,问任意一村庄到其他各村庄的最短距离分别是多少? 思路: ...

  7. 动态规划法(二)——弗洛伊德算法

    问题描述 给定一个带权有向图,计算任意两结点间的最短路径. 迪杰斯特拉算法可以计算指定起点到所有结点的最短路径长度,因此分别对每个结点使用一次迪杰斯特拉算法即可求的任意两结点间的最短路径.迪杰斯特拉算 ...

  8. 视频教程-内功修炼之数据结构与算法-Java

    内功修炼之数据结构与算法 2018年以超过十倍的年业绩增长速度,从中高端IT技术在线教育行业中脱颖而出,成为在线教育领域一匹令人瞩目的黑马.咕泡学院以教学培养.职业规划为核心,旨在帮助学员提升技术技能 ...

  9. 六度分离(弗洛伊德算法)

    六度分离 Time Limit : 5000/1000ms (Java/Other)   Memory Limit : 32768/32768K (Java/Other) Total Submissi ...

最新文章

  1. PHP服务器时间差8小时解决方案
  2. Hibernate【XXXX.hbm.xml】总结
  3. [转]ASP.NET中常用的文件上传下载方法
  4. 用git rebase合并
  5. 产品 电信nb接口调用_中国电信物联网平台NB-IoT业务对接指导书.doc
  6. D. Anton and Chess 模拟题 + 读题
  7. 探求数据仓库关键环节ETL的本质
  8. JEECG第17期架构培训班15号开班啦!每期十个名额,想报名的抓紧时间啦!
  9. 收藏 | 图像识别的可视化解释史
  10. 二度云抢先成为首批中国工信部(.vip/.xyz/.club)域名注册管理机构
  11. ubuntu火狐证书问题
  12. 类路径是什么意思_甲状腺结节4a类严重吗,是什么意思?怎么治疗需要手术吗?一文解答...
  13. STM32工作笔记0077---UCOSIII中使用串口发送数据要注意的点
  14. c语言计算坐标,求助,有关坐标计算的
  15. 人工智能凉凉了?中国 AI 人才缺口高达 12113 个!
  16. 操纵浏览器的历史记录
  17. 关于nginx file not found
  18. new Vue() 和 export default {}及Vue页面组件和标签组件说明与比较(非常重要)
  19. 关于 javadoc
  20. java需要class_java需要class是什么意思

热门文章

  1. 5项有助于提高 Google 关键字排名的措施
  2. 5个月前,如果你没有不屑于刷这份《字节内推+面试宝典》,今天坐到字节Android部门,年薪70w+的人就是你了......
  3. JAMA Neurology:帕金森病跨疾病阶段的新兴神经成像生物标记物
  4. 1.Oracle中的表空间
  5. 下列关于python语言中缩进的说法正确的是_关于Python程序中与“缩进”有关的说法中,以下选项中正确的是 _________ 。_学小易找答案...
  6. 渗透测试国内外研究_浅析晶硅光伏背板阻隔性能测试(一)——水蒸气透过率测试...
  7. (0101)iOS开发之iPad模拟器如何实现分屏模式调试
  8. 【mac】如何取消桌面麦克风
  9. 使用NCBI数据库查询并使用BLAST比对新冠病毒及九种变种的核酸序列
  10. 微信小程序和vue的区别?