40.弗洛伊德(Floyd)算法

概述

我们此前拆解过迪杰斯特拉(Dijkstra)算法,与它一样,弗洛伊德(Floyd)算法也是用于寻找给定的加权图中顶点间最短路径的算法。该算法是1978年图灵奖获得者、斯坦福大学计算机科学系教授罗伯特·弗洛伊德及其团队发现的,以主要创始人 弗洛伊德 命名。
迪杰斯特拉算法通过选定的被访问顶点,求出从出发访问顶点到其他顶点的最短路径,而弗洛伊德算法中每一个顶点都是出发访问点,所以需要将每一个顶点看做被访问顶点,求出从每一个顶点到其他顶点的最短路径。

分析

设置顶点vi到顶点vk的最短路径已知为Lik,顶点vk到vj的最短路径已知为Lkj,顶点vi到vj的路径为Lij,则vi到vj的最短路径为: min((Lik+Lkj),Lij),vk的取值为无向图中所有顶点,则可获得vi到vj的最短路径。
至于vi到vk的最短路径Lik或者vk到vi的最短路径Lkj,是以同样的方式获得。

我们还是回到“郝乡长”的政绩工程——得胜乡的七村修路问题
在这里插入图片描述

首先是对于各个顶点之间举例的初始化
在这里插入图片描述
对于前驱关系也是我们在算法开始之前需要明晰的
在这里插入图片描述
在第一轮循环中,以A(下标:0)作为中间顶点,距离表和前驱关系会更新为:

在这里插入图片描述
以A为中间节点的可能性全部遍历,就会得到更新的距离表和前驱关系。

(无向图)将A作为中间节点情况有:

分析距离表的替换:

• C-A-G 距离 7+2 = 9; --------> CG (N) ------>CG(9)
• C-A-B 距离 7+5 = 12; --------> CB(N) ------>CB(12)
• G-A-B 距离 2+5 = 7; --------> GB(3) 因为7>3所以不做替换!

分析前驱关系表的替换:

• C通过A到G,故前驱关系表中,C行G列的前驱节点替换为A;
• G通过A到C,故前驱关系表中,G行C列的前驱节点替换为A;
• C通过A到B,故前驱关系表中,C行B列的前驱节点替换为A;
• B通过A到C,故前驱关系表中,B行C列的前驱节点替换为A;

如何将A作为中间节点的情况都考虑到?

中间顶点数组{A,B,C,D,E,F,G} 取A(k[0])—> …
出发顶点数组{A,B,C,D,E,F,G} 取A (i[0]) —>取B(i[1])
终点数组{A,B,C,D,E,F,G} 遍历 (j=1,2,3,…) —>(j=1,2,3,…)
时间复杂度: O(n3),较高

代码实现

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 = 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[] vetex = {'A','B','C','D','E','F','G'};
        for (int k = 0; k < dis.length; k++) {
            //先将pre数组输出的一行
            for (int i = 0; i < dis.length; i++) {
                System.out.print(vetex[pre[k][i]] + " ");
            }
            System.out.println();
            //输出dis数组的一行数据
            for (int i = 0; i < dis.length; i++) {
                System.out.print("("+vertex[k]+"到"+vertex[i]+"的最短路径"+dis[k][i]+") ");
            }
            System.out.println();
            System.out.println();
            
        }
        
    }

    //弗洛伊德算法
    public void floyd(){
        int len = 0 ;//变量保存
        //对中间顶点的遍历, k 就是中间顶点的下标
        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] = len;//更新距离
                        pre[i][j] =pre[k][j];//更新前驱节点
                    }
                }
            }
        }
    }
}


关注我,共同进步,每周至少一更。——Wayne

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/109572.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【计算机网络】路由器的工作原理

文章目录 输入端口处理和基于目的地转发交换结构输出端口处理排队问题参考资料 路由器的四个组件 输入端口(input port)&#xff1a;执行物理层功能&#xff08;input port 左边方框、output port 右边方框&#xff09;、数据链路层功能&#xff08;input/output port 中间方框…

css写个三角形

点击三角形&#xff0c;展开或者收起内容 <template><div><div class"zhankai" click"btn()">展开 <span :class"{sanjiao:true,rotate:flag}"></span></div><!-- 展示或者收起 --><el-collapse-…

2023大中型企业数字化运营:互联网时代数据中台价值与应用-亿发

在数字化时代背景下&#xff0c;大中型企业通过构建数据中台以提升业务价值的趋势日益明显。作为企业的战略制定者和高层领导&#xff0c;不仅需要认识到数据的价值&#xff0c;还要深入了解实现数据价值化业务的核心技术&#xff0c;即数据中台。 市场环境的变化带来了数字化转…

【WSL 2】Windows10 安装 WSL 2,并配合 Windows Terminal 和 VSCode 使用

【WSL 2】Windows10 安装 WSL 2&#xff0c;并配合 Windows Terminal 和 VSCode 使用 1 安装 Windows Terminal2 安装 WSL 23 在 Windows 文件资源管理器中打开 WSL 项目4 在 VSCode 中使用 WSL 24.1 必要准备4.2 从 VSCode 中 Connect WSL4.3 从 Linux 中打开 VSCode 1 安装 W…

NAT技术与代理服务器

目录 一、NAT与NAPT技术 1.NAT技术 2.NAPT技术 &#xff08;1&#xff09;四元组的唯一性 &#xff08;2&#xff09;数据的传输过程 &#xff08;3&#xff09;NAPT的缺陷 二、代理服务器 1.正向代理和反向代理 2.代理服务器的应用 &#xff08;1&#xff09;游戏加…

Spring Web MVC入门

一&#xff1a;了解Spring Web MVC (1)关于Java开发 &#x1f31f;Java开发大多数场景是业务开发 比如说京东的业务就是电商卖货、今日头条的业务就推送新闻&#xff1b;快手的业务就是短视频推荐 (2)Spring Web MVC的简单理解 &#x1f497;Spring Web MVC&#xff1a;如何使…

2023想入门Web测试,看这篇文章!

今天要谈的是很多软件测试工程师都需要面对的——Web测试 不管你是处在二十不惑的青春有你阶段还是三十而已的乘风破浪阶段我们都需要面对“Web测试”。 Web测试其实有以下几个方面&#xff1a; 1、页面测试 大多数的Web网站的网页都是html语言编写的&#xff0c;测试工程师…

高等数学教材重难点题型总结(七)微分方程

高数上册最后一章&#xff0c;虽然不如积分难&#xff0c;但也颇为恶心&#xff0c;好在套路很固定&#xff0c;重点在于&#xff1a;区分方程类型&#xff0c;记忆求解公式~ 此外&#xff0c;诸如伯努利、欧拉方程等内容&#xff0c;是考研数学一的内容&#xff0c;学校的期末…

UE5实现相机水平矫正

UE5实现相机水平矫正 思路&#xff0c;用HIT获得基于相机视角的 离散采样点&#xff0c;然后根据距离相机距离进行权重分析。 距离越近&#xff0c;采样约中心&#xff0c;即越接近人眼注意点&#xff0c;最后算出加权平均高度&#xff0c;赋予给相机&#xff0c;相机将水平旋…

神经网络与深度学习第四章前馈神经网络习题解答

[习题4-1] 对于一个神经元 &#xff0c;并使用梯度下降优化参数时&#xff0c;如果输入恒大于0&#xff0c;其收敛速度会比零均值化的输入更慢。 首先看一下CSDN的解释&#xff1a; 如果输入x恒大于0&#xff0c;使用sigmoid作为激活函数的神经元的输出值将会处于饱和状态&a…

强大易于编辑的流程图组织图绘制工具draw.io Mac苹果中文版

draw.io可以绘制多种类型的图表&#xff0c;包括但不限于流程图、组织结构图、网络图、UML图、电气工程图等。draw.io提供了丰富的图形元素和编辑功能&#xff0c;使用户能够轻松地创建和编辑各种复杂的图表。同时&#xff0c;该软件还支持多种导出格式&#xff0c;方便用户在不…

3D网页游戏外包开发引擎

3D网页开发引擎是用于创建具有三维图形、虚拟现实和交互性的网页应用程序的工具。以下是一些常用的3D网页开发引擎以及它们的主要特点&#xff0c;希望对大家有所帮助。北京木奇移动技术有限公司&#xff0c;专业的软件外包开发公司&#xff0c;欢迎交流合作。 1.Three.js&…

微服务-统一网关Gateway

网关的作用 对用户请求做身份认证、权限校验将用户请求路由到微服务&#xff0c;并实现负载均衡对用户请求做限流 搭建网关服务 创建新module&#xff0c;命名为Gateway&#xff0c;引入依赖&#xff08;1.SpringCloudGateway依赖&#xff1b;2.Eureka客户端依赖或者nacos的服…

《C和指针》(5)操作符和表达式

问题 下面这个表达式的类型和值分别是什么? 答&#xff1a;该值为2.0&#xff0c;如果要进行浮点除法&#xff0c;请使用以下表达式 下面这个程序的结果是什么&#xff1f; 答&#xff1a;这是一个狡猾的问题。比较明显的回答是-10(2-3 *4),但实际上它因编译器而异。乘法运…

IPv6+ 3.0关键技术解析与应用实践探索

IPv6作为面向5G和云计算的智能IP技术&#xff0c;其核心是以IPv6技术架构为底座&#xff0c;并基于用户的新兴业务进行创新发展而来的。任何一项技术创新的背后都有一只看不见的推手-用户的需求&#xff0c;也就是用户的业务发展所需&#xff0c;进一步来说是用户的应用系统在驱…

Ubuntu 诞生 19 年

导读2004 年 10 月 20 日&#xff0c;Ubuntu 4.10 正式发布&#xff0c;代号‘Warty Warthog’。 作为 Ubuntu 第一个版本&#xff0c;4.10 问世后立刻受到广大 Linux 用户欢迎。它搭载了当时最新的 GNOME 2.8 桌面环境&#xff0c;以及一系列实用软件&#xff0c;比如 Mozilla…

小程序开发——小程序项目的配置与生命周期

1.app.json配置属性 app.json配置属性 2.页面配置 app的页面配置指的是pages属性&#xff0c; pages数组的第一个页面将默认作为小程序的启动页。利用开发工具新建页面时&#xff0c;则pages属性对应的数组将自动添加该页面的路径&#xff0c;若是在硬盘中添加文件的形式则不…

通过servlet设计一个博客系统

博客系统 准备工作servlrt依赖mysql依赖jackson依赖 服务器和数据库的交互设计数据库/数据表封装DBUtil,实现建立连接和断开连接创建实体类bloguser 编写Dao类BlogDaoUserDao 前端和服务器的交互功能一:博客列表页约定格式后端代码前端代码 功能二:实现博客详情页约定格式后端代…

CAD需要学c语言嘛?

CAD需要学c语言嘛&#xff1f; AutoCAD 和 C 语言没有关系的。 如果非要说是 AutoCAD 和哪个编程语言有关系&#xff0c;那应该是 VBA, 可以通过 VBA 编程&#xff0c;最近很多小伙伴找我&#xff0c;说想要一些c语言资料&#xff0c;然后我根据自己从业十年经验&#xff0c;熬…

MySQL扩展语句和约束条件

MySQL扩展语句 create TABLE if not exists ky32 (id int(4) zerofill primary key auto_inc rement&#xff0c; #表示该字段可以自增长&#xff0c;默认从1开始每条记录会自动递增1name varchar(10) not null,cradid int(10) not null unique key,hobby varchar (50))&#x…