当前位置: 首页 > news >正文

图论进阶之路-最短路(Floyd)

时间复杂度:O(n^3)

使用场景:当需要得知任意两个点的最短距离以及其路径时使用

准备:需要两个矩阵

一个记录最短距离(D)

一个记录最短路径的最后一个结点(P)

其核心在于不断的判断越过中间结点是否比不越过中间节点距离更短,迭代的结果也会影响到后面的路径的更新,通过不断的更新,使得每两个节点直接的距离被都更新到最短

具体过程:

 d4573be44ccf4e819af51be9bff213b1.png

1.初始化 D,P 矩阵,D 矩阵初始化为所有结点的入度距离,P 矩阵 初始化为所有结点的入度结点

        int MAX = Integer.MAX_VALUE;int[][] D = {{MAX,MAX,MAX,MAX,  6},{  9,MAX,  3,MAX,MAX},{  2,MAX,MAX,  5,MAX},{MAX,MAX,MAX,MAX,  1},{MAX,MAX,MAX,MAX,MAX}};int[][] P = {{-1,-1,-1,-1, 0},{ 1,-1, 1,-1,-1},{ 2,-1,-1, 2,-1},{-1,-1,-1,-1, 3},{-1,-1,-1,-1,-1}};

2.将每一个点都做一次中间结点

3.在当前中间节点的基础上,遍历所有结点,更新最短路

关于两个矩阵更新规则:

  • D: 根据上一次的 D ,若 遍历到的结点到中间结点 + 中间结点到目标结点 < 上一次遍历到的结点到目标结点,就更新
  • P: 若 D 发生变动,则将路径更新为 上一次 中间结点到目标节点的路径

共五个结点,故我们需要重复 5 次 2,3 步骤

public static void main(String[] args) {int MAX = Integer.MAX_VALUE/2;int[][] D = {{MAX,MAX,MAX,MAX,  6},{  9,MAX,  3,MAX,MAX},{  2,MAX,MAX,  5,MAX},{MAX,MAX,MAX,MAX,  1},{MAX,MAX,MAX,MAX,MAX}};int[][] P = {{-1,-1,-1,-1, 0},{ 1,-1, 1,-1,-1},{ 2,-1,-1, 2,-1},{-1,-1,-1,-1, 3},{-1,-1,-1,-1,-1}};for(int k=0;k<5;k++) {//中间结点	//遍历所有的结点对for(int i=0;i<5;i++) {for(int j=0;j<5;j++) {if(D[i][k] + D[k][j] < D[i][j]) {D[i][j] = D[i][k] + D[k][j];P[i][j] = P[k][j];}}}}}

当中间点为 0 时,两个矩阵的更新结果为:

 

[∞, ∞, ∞, ∞, 6]

[9, ∞, 3, ∞, 15]

[2, ∞, ∞, 5, 8]

[∞, ∞, ∞, ∞, 1]

[∞, ∞, ∞, ∞, ∞]

---------------------------------

[-1, -1, -1, -1, 0]

[1, -1, 1, -1, 0]

[2, -1, -1, 2, 0]

[-1, -1, -1, -1, 3]

[-1, -1, -1, -1, -1]

=================================

 

当中间点为 1 时,两个矩阵的更新结果为:

 

[∞, ∞, ∞, ∞, 6]

[9, ∞, 3, ∞, 15]

[2, ∞, ∞, 5, 8]

[∞, ∞, ∞, ∞, 1]

[∞, ∞, ∞, ∞, ∞]

---------------------------------

[-1, -1, -1, -1, 0]

[1, -1, 1, -1, 0]

[2, -1, -1, 2, 0]

[-1, -1, -1, -1, 3]

[-1, -1, -1, -1, -1]

=================================

 

当中间点为 2 时,两个矩阵的更新结果为:

 

[∞, ∞, ∞, ∞, 6]

[5, ∞, 3, 8, 11]

[2, ∞, ∞, 5, 8]

[∞, ∞, ∞, ∞, 1]

[∞, ∞, ∞, ∞, ∞]

---------------------------------

[-1, -1, -1, -1, 0]

[2, -1, 1, 2, 0]

[2, -1, -1, 2, 0]

[-1, -1, -1, -1, 3]

[-1, -1, -1, -1, -1]

=================================

 

当中间点为 3 时,两个矩阵的更新结果为:

 

[∞, ∞, ∞, ∞, 6]

[5, ∞, 3, 8, 9]

[2, ∞, ∞, 5, 6]

[∞, ∞, ∞, ∞, 1]

[∞, ∞, ∞, ∞, ∞]

---------------------------------

[-1, -1, -1, -1, 0]

[2, -1, 1, 2, 3]

[2, -1, -1, 2, 3]

[-1, -1, -1, -1, 3]

[-1, -1, -1, -1, -1]

=================================

 

当中间点为 4 时,两个矩阵的更新结果为:

 

[∞, ∞, ∞, ∞, 6]

[5, ∞, 3, 8, 9]

[2, ∞, ∞, 5, 6]

[∞, ∞, ∞, ∞, 1]

[∞, ∞, ∞, ∞, ∞]

---------------------------------

[-1, -1, -1, -1, 0]

[2, -1, 1, 2, 3]

[2, -1, -1, 2, 3]

[-1, -1, -1, -1, 3]

[-1, -1, -1, -1, -1]

=================================

4.若最后需要得到最短路路径:可以通过 先找到 路径矩阵的位置,得到前一个点,再找到该点与前一个点的前一个点,直到前一个点变成自身为止

如:我们要找到 v1 到 v0 的最短路径

先找到 1 -> 0 的最近的前一个结点,也就是 P[1][0]  = 2

得知了前一个结点为 2 ,记录路径 2 -> 0

继续往前找,1 -> 2 的前一个结点,也就是 P[1][2] = 1

得知了前一个结点为 1,记录路径 1 -> 2 -> 0

再继续往前就是寻找 1 -> 1 ,自己找自己的时候就代表路径已经完整了

故 v1 到 v0 的最短路径为: 1 -> 2 -> 0

 

 

相关文章:

图论进阶之路-最短路(Floyd)

时间复杂度&#xff1a;O(n^3) 使用场景&#xff1a;当需要得知任意两个点的最短距离以及其路径时使用 准备&#xff1a;需要两个矩阵 一个记录最短距离&#xff08;D&#xff09; 一个记录最短路径的最后一个结点&#xff08;P&#xff09; 其核心在于不断的判断越过中间…...

安装sqllab靶机之后,练习关卡报403 forbidden

解决办法&#xff1a; 在nginx的conf文件中添加上访问index.php vim /usr/local/nginx/conf/nginx.conf 保存退出 再重启一下nginx&#xff0c;就完成了。 ./nginx -s reload...

微信VX多开 免扫码 登录 互斥体 可视化 Exui v1.1 易语言源码附成品软件

UI设计&#xff1a; 1. EXUI界面库20240204 调用的模块&#xff1a; 1. wow64_hook_3.02.ec&#xff08;压缩包内含&#xff09; 2. 精易模块[v11.1.0].ec&#xff08;自行下载&#xff09; 更新日志&#xff1a; v1.1 2024年7月25日13:28:43 { 1. 有人反馈 设置了V…...

JavaEE 从入门到精通(一) ~ Maven

晚上好&#xff0c;愿这深深的夜色给你带来安宁&#xff0c;让温馨的夜晚抚平你一天的疲惫&#xff0c;美好的梦想在这个寂静的夜晚悄悄成长。 目录 前言 1.1 概念 什么是 Maven&#xff1f; Maven 的核心概念 1.2 maven依赖坐标 1.3 maven仓库 1.4 maven安装 1.5 mave…...

滚珠丝杆与丝杆支撑座:稳定性与精度的双重保障

丝杆支撑座是连接滚珠丝杆与电机的轴承&#xff0c;采用优质的轴承能确保支撑座与滚珠丝杆之间的刚性平衡。那么&#xff0c;滚珠丝杆搭连接杆支撑座有哪些优缺点呢&#xff1f; 正常情况下&#xff0c;丝杆支撑座能够提供稳定的支撑力&#xff0c;确保滚珠丝杆在复杂工况下保持…...

实验5-11 空心的数字金字塔

本题要求实现一个函数&#xff0c;输出n行空心的数字金字塔。 函数接口定义&#xff1a; void hollowPyramid( int n );其中n是用户传入的参数&#xff0c;为[1, 9]的正整数。要求函数按照如样例所示的格式打印出n行空心的数字金字塔&#xff0c;请注意&#xff0c;最后一行的…...

C#对象和类型

属性、方法、字段 字段和属性的区别 在C#中&#xff0c;字段&#xff08;fields&#xff09;和属性&#xff08;properties&#xff09;都是类的成员&#xff0c;它们提供了类存储数据的方式&#xff0c;但它们在用途和功能上有着明显的区别。 字段 字段通常用来存储类…...

免费分享一套SpringBoot+Vue图书(图书借阅)管理系统【论文+源码+SQL脚本】,帅呆了~~

大家好&#xff0c;我是java1234_小锋老师&#xff0c;看到一个不错的SpringBootVue图书(图书借阅)管理系统&#xff0c;分享下哈。 项目视频演示 【免费】SpringBootVue图书(图书借阅)管理系统 Java毕业设计_哔哩哔哩_bilibili 项目介绍 本论文阐述了一套先进的图书管理系…...

数据结构与算法--队列

文章目录 提要队列的定义队列的认识队列的应用队列的抽象数据类型队列的存储结构队列的链式存储结构与实现链队的进队和出队操作链队的数据类型初始化链队列入队操作出队操作队列的顺序存储结构与实现顺序队列的假溢出问题队列上溢循环队列循环队列取下一相邻单元下标运算队满与…...

<Qt> 常用控件

目录 一、控件概述 二、QWidget 核心属性 &#xff08;一&#xff09;QWidget的核心属性概览 1. enabled 2. geometry 3. WindowFrame的影响 4. windowTitle 5. window Icon 6. windowOpacity 7. cursor 8. font 9. toolTip 10. focusPolicy 11. styleSheet 三、…...

关于C/C++的编译、构建、CMake、x86_amd64等问题(自用)

被这些玩意整红温了 编译器版本 x86&#xff1a;编译器为x86版本&#xff0c;输出文件为x86。amd64_x86&#xff1a;编译器为amd64版本&#xff0c;输出文件为x86。amd64&#xff1a;编译器为amd64版本&#xff0c;输出文件为amd64。x86_amd64&#xff1a;编译器为x86版本&am…...

【设计模式】工厂模式详解

1.简介 工厂模式是一种创建型设计模式&#xff0c;通过提供一个接口或抽象类来创建对象&#xff0c;而不是直接实例化对象。工厂模式的主要思想是将对象的创建与使用分离&#xff0c;使得创建对象的过程更加灵活和可扩展。 工厂模式主要包括以下角色&#xff1a; 抽象工厂&a…...

【Spring Boot】用 Spring Security 实现后台登录及权限认证功能

用 Spring Security 实现后台登录及权限认证功能 1.引入依赖2.创建权限开放的页面3.创建需要权限验证的页面4.配置 Spring Security4.1 配置 Spring MVC4.2 配置 Spring Security 5.创建登录页面6.测试权限 1.引入依赖 使用前需要引入相关依赖&#xff0c;见以下代码&#xff…...

PHP开发【石头剪刀布小游戏】

石头剪刀布小游戏 玩法超级简单&#xff0c;你只需要在下面选择石头、剪刀或者布&#xff0c;然后提交&#xff0c;系统就会随机生成电脑的选择&#xff0c;告诉你最终的结果哦&#xff01; 游戏规则&#xff1a; 如果你的选择和电脑一样&#xff0c;那么就是平局。如果你赢…...

(leetcode学习)42. 接雨水

给定 n 个非负整数表示每个宽度为 1 的柱子的高度图&#xff0c;计算按此排列的柱子&#xff0c;下雨之后能接多少雨水。 示例 1&#xff1a; 输入&#xff1a;height [0,1,0,2,1,0,1,3,2,1,2,1] 输出&#xff1a;6 解释&#xff1a;上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表…...

Python编程实例2

一、通过用户输入数字计算阶乘 # 获取用户输入的数字 num int(input("请输入一个数字: ")) factorial 1 # 查看数字是负数&#xff0c;0 或 正数 if num < 0:print("抱歉&#xff0c;负数没有阶乘") elif num 0:print("0 的阶乘为 1") e…...

排序算法:堆排序,golang实现

目录 前言 堆排序 代码示例 1. 算法包 2. 堆排序代码 3. 模拟程序 4. 运行程序 5. 从大到小排序 堆排序的思想 堆排序的实现逻辑 1. 构建最大堆 2. 排序 循环次数测试 假如 10 条数据进行排序 假如 20 条数据进行排序 假如 30 条数据进行排序 假设 5000 条数据…...

【网络安全入门】学习网络安全必须知道的77个网络基础知识

1、TCP/IP 协议的四层模型&#xff08;网络接口层、网络层、传输层、应用层&#xff09; TCP/IP 协议是互联网通信的基础&#xff0c;四层模型中&#xff0c;网络接口层负责与物理网络的连接&#xff1b;网络层主要处理 IP 数据包的路由和转发&#xff1b;传输层提供端到端的可…...

limit 以及分页 SQL 语句

目录 1. 作用 2. 演示 3. 分页 SQL 语句 1. 作用 获取结果集的一部分&#xff1b; 2. 演示 &#xff08;1&#xff09;如下&#xff0c;获取表的前三行&#xff1b; &#xff08;2&#xff09;只有一个数字&#xff0c;默认从 0 开始&#xff1b; &#xff08;3&#x…...

mysql8.0规范

MySQL 数据库开发规范 目录 背景与目标规范列表 1. 库表设计 1.1 必须字段1.2 命名规范 2. 定义规范 2.1 约束规范2.2 类型规范 2.2.1 字段类型与长度2.2.2 状态字段数据类型2.2.3 布尔型2.2.4 varchar和text, json2.2.5 decimal(m,d) 3. 索引规范4. 其他规范5. SQL 使用 5.…...

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造&#xff0c;完美适配AGV和无人叉车。同时&#xff0c;集成以太网与语音合成技术&#xff0c;为各类高级系统&#xff08;如MES、调度系统、库位管理、立库等&#xff09;提供高效便捷的语音交互体验。 L…...

Prompt Tuning、P-Tuning、Prefix Tuning的区别

一、Prompt Tuning、P-Tuning、Prefix Tuning的区别 1. Prompt Tuning(提示调优) 核心思想:固定预训练模型参数,仅学习额外的连续提示向量(通常是嵌入层的一部分)。实现方式:在输入文本前添加可训练的连续向量(软提示),模型只更新这些提示参数。优势:参数量少(仅提…...

中南大学无人机智能体的全面评估!BEDI:用于评估无人机上具身智能体的综合性基准测试

作者&#xff1a;Mingning Guo, Mengwei Wu, Jiarun He, Shaoxian Li, Haifeng Li, Chao Tao单位&#xff1a;中南大学地球科学与信息物理学院论文标题&#xff1a;BEDI: A Comprehensive Benchmark for Evaluating Embodied Agents on UAVs论文链接&#xff1a;https://arxiv.…...

CMake基础:构建流程详解

目录 1.CMake构建过程的基本流程 2.CMake构建的具体步骤 2.1.创建构建目录 2.2.使用 CMake 生成构建文件 2.3.编译和构建 2.4.清理构建文件 2.5.重新配置和构建 3.跨平台构建示例 4.工具链与交叉编译 5.CMake构建后的项目结构解析 5.1.CMake构建后的目录结构 5.2.构…...

【Web 进阶篇】优雅的接口设计:统一响应、全局异常处理与参数校验

系列回顾&#xff1a; 在上一篇中&#xff0c;我们成功地为应用集成了数据库&#xff0c;并使用 Spring Data JPA 实现了基本的 CRUD API。我们的应用现在能“记忆”数据了&#xff01;但是&#xff0c;如果你仔细审视那些 API&#xff0c;会发现它们还很“粗糙”&#xff1a;有…...

C++中string流知识详解和示例

一、概览与类体系 C 提供三种基于内存字符串的流&#xff0c;定义在 <sstream> 中&#xff1a; std::istringstream&#xff1a;输入流&#xff0c;从已有字符串中读取并解析。std::ostringstream&#xff1a;输出流&#xff0c;向内部缓冲区写入内容&#xff0c;最终取…...

CRMEB 框架中 PHP 上传扩展开发:涵盖本地上传及阿里云 OSS、腾讯云 COS、七牛云

目前已有本地上传、阿里云OSS上传、腾讯云COS上传、七牛云上传扩展 扩展入口文件 文件目录 crmeb\services\upload\Upload.php namespace crmeb\services\upload;use crmeb\basic\BaseManager; use think\facade\Config;/*** Class Upload* package crmeb\services\upload* …...

Unit 1 深度强化学习简介

Deep RL Course ——Unit 1 Introduction 从理论和实践层面深入学习深度强化学习。学会使用知名的深度强化学习库&#xff0c;例如 Stable Baselines3、RL Baselines3 Zoo、Sample Factory 和 CleanRL。在独特的环境中训练智能体&#xff0c;比如 SnowballFight、Huggy the Do…...

select、poll、epoll 与 Reactor 模式

在高并发网络编程领域&#xff0c;高效处理大量连接和 I/O 事件是系统性能的关键。select、poll、epoll 作为 I/O 多路复用技术的代表&#xff0c;以及基于它们实现的 Reactor 模式&#xff0c;为开发者提供了强大的工具。本文将深入探讨这些技术的底层原理、优缺点。​ 一、I…...

大数据学习(132)-HIve数据分析

​​​​&#x1f34b;&#x1f34b;大数据学习&#x1f34b;&#x1f34b; &#x1f525;系列专栏&#xff1a; &#x1f451;哲学语录: 用力所能及&#xff0c;改变世界。 &#x1f496;如果觉得博主的文章还不错的话&#xff0c;请点赞&#x1f44d;收藏⭐️留言&#x1f4…...