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

图论算法:Floyd算法

文章目录

  • Floyd算法
  • 例题:灾后重建

Floyd算法

Floyd算法用于求图中任意两点之间的最短路径,该算法主要运用了动态规划的思想。

思考: 给你几个点与边,可以组成一张图,那么如何求得任意两点之间的最短路径呢

我们貌似可以使用dfs或者bfs来做,那么这样做的话,我们的dfs用来求一个点到一个点之间的最短路径是可行的,但是如果是n个点?我们难道需要进行n次的dfs或者bfs吗,每次记录一个点到任意一点的最短路径,这显然是不可能的。


现在思考一个问题,假设我们的图中的每两个顶点之间的边是单向边

  • 如果我们不能使用中转点:我们 1 -> 2 :那么我们就需要 找到 1->2直接的一条相连的路径这条路径长度为e[1] [2]

  • 如果我们只能使用一个中转点:我们从 1 -> 2:那么我们就需要找到 1->3 ->2(我们假设这是一个比前面 1->2路程短的路径),那么我们就可以得到: e[1] [3] + e[3] [2] 的最短路径长度

  • 如果我们只能使用两个中转点:我们从 1 -> 2:那么我们就需要找到 1->3->4 ->2(我们假设这是一个比前面 1->3->2路程短的路径),那么我们就可以得到: 首先中转3:e[1] [3]+e[3] [4],然后中转4:e[1] [4] + e[4] [2] 的最短路径长度,最后的路径就是e[1] [4] + e[4] [2]

  • 同理如果我们可以使用 k 个中转点。则我们便可以得到最后的最短路径就是 e[1] [k] + e[k] [2],其中 e[1] [k] 包含之前所有 k -1 个中转点的计算后的最短路径。

那么我们便可以得到一个结论:我们可以枚举 从 i 到 j 经过的前k个中转点,使得i到j的路径最短。

因此 Floyd算法的核心就是从i号顶点到j号顶点只经过前k号点的最短路程

注意:作为中转不是经过第 k 个点,而是经过了 前k 个,包含 1,2,3,4,5,6 k-1 k,即表示这 从 i到j我们可以经过总共 k 个中转点,来使得这条路径最短

算法如下:

for (int k=1;k<=n;k++)
{for (int i=1;i<=n;i++){for (int j=1;j<=n;j++){dp[i][j]=min(dp[i][j],dp[i][k]+dp[k][j]);}}
}

例题:灾后重建

B 地区在地震过后,所有村庄都造成了一定的损毁,而这场地震却没对公路造成什么影响。但是在村庄重建好之前,所有与未重建完成的村庄的公路均无法通车。换句话说,只有连接着两个重建完成的村庄的公路才能通车,只能到达重建完成的村庄。

给出 B 地区的村庄数 NNN,村庄编号从 000N−1N-1N1,和所有 MMM 条公路的长度,公路是双向的。并给出第 iii 个村庄重建完成的时间 tit_iti,你可以认为是同时开始重建并在第 tit_iti 天重建完成,并且在当天即可通车。若 tit_iti000 则说明地震未对此地区造成损坏,一开始就可以通车。之后有 QQQ 个询问 (x,y,t)(x,y,t)(x,y,t),对于每个询问你要回答在第 ttt 天,从村庄 xxx 到村庄 yyy 的最短路径长度为多少。如果无法找到从 xxx 村庄到 yyy 村庄的路径,经过若干个已重建完成的村庄,或者村庄 xxx 或村庄 yyy 在第 ttt 天仍未重建完成,则需要返回 -1


这道题目就是Floyd算法的模板题。

这道题目让我们求得两个村庄之间的最短路程,因此我们就可以把两个村庄看作两个点,并且中转k个点,来求得最短路径

但是如果我们采用每次询问都 进行一次floyd算法的话查找两个点的最短路径,显然是会超时的。

我们注意到有个时间的概念在里面,即每个村庄的 修复时间 是固定的,并且是会影响到我们的选择的,因为如果我们计算 1 到 3的村庄的最短路径,可能这两个村庄的修复时间在我们所给的时间内,但是如果我们选择中转,则其他的点的时间都大于我们所给的时间,所以我们不能从其他点中转过来,但是确实从其他点中转使得 1到 3 的路程会更短,因此这个时间我们便可以设置为 k 的值,即在 k时间内中转,不能超过 k时间,因此我们就可以每次询问使用一次floyd算法了,但是我们的k是固定的,我们只需要两重循环就好了。


dp[i] [j] :表示从 i 到 j 的最短距离

状态转移方程:
dp[i][j]=min(dp[i][j],dp[i][k]+dp[k][j])dp[i][j]=min(dp[i][j],dp[i][k]+dp[k][j]) dp[i][j]=min(dp[i][j],dp[i][k]+dp[k][j])
需要注意的几点:

  • dp存储最小值,因此我们首先要初始化为 INF一个极大值
  • dp[i] [i] ,即 第 i个点与第i个点之间的距离为0
  • 注意 边是双向边,因此需要存储 i 到 j ,j 到 i 的距离都为边的距离

AC code

//TODO: Write code here
int n,m,q;
const int N=1e3+10;
int nums[N],dp[N][N];
void Floyd(int k)
{for (int i=0;i<n;i++){for (int j=0;j<n;j++){dp[i][j]=dp[j][i]=min(dp[i][j],dp[i][k]+dp[k][j]);}}
}
signed main()
{cin>>n>>m;for (int i=0;i<n;i++) cin>>nums[i];for (int i=0;i<n;i++){for (int j=0;j<n;j++){dp[i][j]=INF;}}for (int i=0;i<n;i++){dp[i][i]=0;}for (int i=1;i<=m;i++){int a,b,s;cin>>a>>b>>s;dp[a][b]=dp[b][a]=s;  //两点之间的距离}cin>>q;int now=0;for (int i=1;i<=q;i++){int s1,s2,s3;cin>>s1>>s2>>s3;//根据时间进行处理//时间是逐渐增长的,因此每次 floyd的 k 都是随时间变化的while (nums[now]<=s3 && now<n)//目前更新的点在询问点之前{Floyd(now);//前now个时间之前更新最短路now++;}if (nums[s1]>s3 || nums[s2]>s3){cout<<-1<<endl;}else {if (dp[s1][s2]==INF) cout<<-1<<endl;else cout<<dp[s1][s2]<<endl;}}
#define one 1   return 0;
}

相关文章:

图论算法:Floyd算法

文章目录Floyd算法例题&#xff1a;灾后重建Floyd算法 Floyd算法用于求图中任意两点之间的最短路径&#xff0c;该算法主要运用了动态规划的思想。 思考&#xff1a; 给你几个点与边&#xff0c;可以组成一张图&#xff0c;那么如何求得任意两点之间的最短路径呢&#xff1f;…...

回顾 | .NET MAUI 跨平台应用开发 - 用 .NET MAUI 开发一个无人机应用(下)

点击蓝字关注我们编辑&#xff1a;Alan Wang排版&#xff1a;Rani Sun微软 Reactor 为帮助广开发者&#xff0c;技术爱好者&#xff0c;更好的学习 .NET Core, C#, Python&#xff0c;数据科学&#xff0c;机器学习&#xff0c;AI&#xff0c;区块链, IoT 等技术&#xff0c;将…...

部署有多个仓库的svn服务

centos7自带svn服务&#xff0c;现需要创建多个仓库&#xff0c;并实现用户读写功能 创建svn版本库 mkdir /home/svn mkdir /home/svn/confmkdir /home/svn/yk1 mkdir /home/svn/yk2 svnadmin create /home/svn/yk1 svnadmin create /home/svn/yk2 进入版本库yk1的配置文件路…...

Mapper文件注入问题

Mapper文件注入问题UserMapper that could not be found.原因分析解决方案程序正常运行&#xff0c;但是注入类爆红问题原因分析解决方法UserMapper’ that could not be found. 原因分析 撰写了mapper文件&#xff0c;但是没有注入spring容器 解决方案 添加mybatis.mapper-…...

基于微信小程序的国产动漫论坛小程序

文末联系获取源码 开发语言&#xff1a;Java 框架&#xff1a;ssm JDK版本&#xff1a;JDK1.8 服务器&#xff1a;tomcat7 数据库&#xff1a;mysql 5.7/8.0 数据库工具&#xff1a;Navicat11 开发软件&#xff1a;eclipse/myeclipse/idea Maven包&#xff1a;Maven3.3.9 浏览器…...

常用限流算法

简单时间窗口 算法逻辑&#xff1a;设置周期时间内的最大并发量问题&#xff1a;在周期尾端进去阈值并发后&#xff0c;进入下一周期时&#xff0c;又进入阈值并发量&#xff0c;则会出现瞬时并发量是阈值的2倍。 滑动时间窗口&#xff08;优化&#xff09; 算法逻辑&#xf…...

前端面经详解

目录 css 盒子充满屏幕 A.给div设置定位 B.设置html,body的宽高 C.相对当前屏幕高度&#xff08;强烈推荐&#xff09; 三列布局&#xff1a;左右固定&#xff0c;中间自适应 flex布局&#xff08;强烈推荐&#xff09; grid布局 magin负值法 自身浮动 绝对定位 圣…...

网页CAD开发快速入门

演示说明 提示:目前提供两种在网页中浏览编辑CAD图纸方案&#xff0c;详细说明见&#xff1a;MxDraw帮助 网页中打开CAD最简步骤&#xff1a; 第一步: 安装插件运行环境&#xff0c;下载安装(可能需要退杀毒软件)&#xff1a;https://demo.mxdraw3d.com:3562/MxDrawx86Setup…...

C#开发的OpenRA的mod.yaml文件

C#开发的OpenRA的mod.yaml文件 在OpenRA游戏里,会看到这样一段代码: Manifest LoadMod(string id, string path){IReadOnlyPackage package = null;try{if (!Directory.Exists(path)){Log.Write("debug", path + " is not a valid mod package");return …...

【ESP32+freeRTOS学习笔记-(七)中断管理】

目录1、概述2、在ISR中使用FreeRTOS中专用的API2.1 独立的用于ISR中的API2.2 关于xHigherPriorityTaskWoken 参数的初步理解3、延迟中断处理的方法-将中断中的处理推迟到任务中去4 方法一&#xff1a;用二进制信号量来同步ISR与”延时处理的任务“4.1 二进制信号量4.2 函数用法…...

【总结】1591- 从入门到精通:使用 TypeScript 开发超强的 CLI 工具

作为一名开发者&#xff0c;掌握 CLI 工具的开发能力是非常重要的。本文将指导你如何使用 TypeScript 和 CAC 库开发出功能强大的 CLI 工具。快速入门首先&#xff0c;需要先安装 Node.js 和 npm&#xff08;Node Package Manager&#xff09;&#xff0c;然后在项目目录中创建…...

【Java】int和Integer的区别?为什么有包装类?

int和Integer的区别&#xff1f;为什么有包装类&#xff1f; java是一种强类型的语言&#xff0c;所以所有的属性都必须要有一个数据类型。 PS&#xff1a;java10有了局部变量类型推导&#xff0c;可以使用var来代替某个具体的数据类型&#xff0c;但是在字节码阶段&#xff0…...

【LeetCode】石子游戏 IV [H](动态规划)

1510. 石子游戏 IV - 力扣&#xff08;LeetCode&#xff09; 一、题目 Alice 和 Bob 两个人轮流玩一个游戏&#xff0c;Alice 先手。 一开始&#xff0c;有 n 个石子堆在一起。每个人轮流操作&#xff0c;正在操作的玩家可以从石子堆里拿走 任意 非零 平方数 个石子。 如果石…...

修改Vue项目运行的IP和端口

前言 我们在使用VsCode启动Vue项目的时候&#xff0c;我发现&#xff1a;默认的端口号好像和tomcat一样&#xff0c;默认都是8080&#xff0c;如果8080被占用了&#xff0c;就会使用8081,8082这样的方式以此类推。 那么&#xff0c;我们是否可以像后端一样&#xff0c;通过修改…...

【C++提高编程】map/ multimap 容器详解(附测试用例与结果图)

目录1. map/ multimap容器1.1 map基本概念1.2 map构造和赋值1.3 map大小和交换1.4 map插入和删除1.5 map查找和统计1.6 map容器排序1.7 案例-员工分组1.7.1 案例描述1.7.2 实现步骤1. map/ multimap容器 1.1 map基本概念 简介&#xff1a; map中所有元素都是pairpair中第一个…...

laravel操作redis和缓存操作

一&#xff1a;操作redis1&#xff1a;redis拓展安装composer require predis/predis或者你也可以通过 PECL 安装 PhpRedis PHP 扩展,安装方法比较复杂,个人不推荐2&#xff1a;配置redis在config/database.php文件中配置redis(1)&#xff1a;单个redis配置redis > [client …...

目标检测论文阅读:GaFPN算法笔记

标题&#xff1a;Construct Effective Geometry Aware Feature Pyramid Network for Multi-Scale Object Detection 会议&#xff1a;AAAI2022 论文地址&#xff1a;https://ojs.aaai.org/index.php/AAAI/article/view/19932 文章目录Abstract1. Introduction2. Related Work2.…...

【转】Generative Pretrained Transformer

原文链接&#xff1a;https://www.cnblogs.com/yifanrensheng/p/13167796.html一、GPT简介1.1 背景目前大多数深度学习方法依靠大量的人工标注信息&#xff0c;这限制了在很多领域的应用。此外&#xff0c;即使在可获得相当大的监督语料情况下&#xff0c;以无监督学习的方式学…...

day34|343. 整数拆分、96.不同的二叉搜索树

343. 整数拆分 给定一个正整数 n &#xff0c;将其拆分为 k 个 正整数 的和&#xff08; k > 2 &#xff09;&#xff0c;并使这些整数的乘积最大化。 返回 你可以获得的最大乘积 。 示例 1: 输入: n 2 输出: 1 解释: 2 1 1, 1 1 1。 示例 2: 输入: n 10 输出: 36 解…...

WeNet - 初识

文章目录关于 WeNet快速上手识别训练环境准备训练关于 WeNet Production First and Production Ready End-to-End Speech Recognition Toolkit github: https://github.com/wenet-e2e/wenet官方中文说明&#xff1a;https://github.com/wenet-e2e/wenet/blob/main/README_CN.md…...

51c自动驾驶~合集58

我自己的原文哦~ https://blog.51cto.com/whaosoft/13967107 #CCA-Attention 全局池化局部保留&#xff0c;CCA-Attention为LLM长文本建模带来突破性进展 琶洲实验室、华南理工大学联合推出关键上下文感知注意力机制&#xff08;CCA-Attention&#xff09;&#xff0c;…...

无法与IP建立连接,未能下载VSCode服务器

如题&#xff0c;在远程连接服务器的时候突然遇到了这个提示。 查阅了一圈&#xff0c;发现是VSCode版本自动更新惹的祸&#xff01;&#xff01;&#xff01; 在VSCode的帮助->关于这里发现前几天VSCode自动更新了&#xff0c;我的版本号变成了1.100.3 才导致了远程连接出…...

【大模型RAG】Docker 一键部署 Milvus 完整攻略

本文概要 Milvus 2.5 Stand-alone 版可通过 Docker 在几分钟内完成安装&#xff1b;只需暴露 19530&#xff08;gRPC&#xff09;与 9091&#xff08;HTTP/WebUI&#xff09;两个端口&#xff0c;即可让本地电脑通过 PyMilvus 或浏览器访问远程 Linux 服务器上的 Milvus。下面…...

React Native在HarmonyOS 5.0阅读类应用开发中的实践

一、技术选型背景 随着HarmonyOS 5.0对Web兼容层的增强&#xff0c;React Native作为跨平台框架可通过重新编译ArkTS组件实现85%以上的代码复用率。阅读类应用具有UI复杂度低、数据流清晰的特点。 二、核心实现方案 1. 环境配置 &#xff08;1&#xff09;使用React Native…...

基于Uniapp开发HarmonyOS 5.0旅游应用技术实践

一、技术选型背景 1.跨平台优势 Uniapp采用Vue.js框架&#xff0c;支持"一次开发&#xff0c;多端部署"&#xff0c;可同步生成HarmonyOS、iOS、Android等多平台应用。 2.鸿蒙特性融合 HarmonyOS 5.0的分布式能力与原子化服务&#xff0c;为旅游应用带来&#xf…...

转转集团旗下首家二手多品类循环仓店“超级转转”开业

6月9日&#xff0c;国内领先的循环经济企业转转集团旗下首家二手多品类循环仓店“超级转转”正式开业。 转转集团创始人兼CEO黄炜、转转循环时尚发起人朱珠、转转集团COO兼红布林CEO胡伟琨、王府井集团副总裁祝捷等出席了开业剪彩仪式。 据「TMT星球」了解&#xff0c;“超级…...

【SQL学习笔记1】增删改查+多表连接全解析(内附SQL免费在线练习工具)

可以使用Sqliteviz这个网站免费编写sql语句&#xff0c;它能够让用户直接在浏览器内练习SQL的语法&#xff0c;不需要安装任何软件。 链接如下&#xff1a; sqliteviz 注意&#xff1a; 在转写SQL语法时&#xff0c;关键字之间有一个特定的顺序&#xff0c;这个顺序会影响到…...

uniapp微信小程序视频实时流+pc端预览方案

方案类型技术实现是否免费优点缺点适用场景延迟范围开发复杂度​WebSocket图片帧​定时拍照Base64传输✅ 完全免费无需服务器 纯前端实现高延迟高流量 帧率极低个人demo测试 超低频监控500ms-2s⭐⭐​RTMP推流​TRTC/即构SDK推流❌ 付费方案 &#xff08;部分有免费额度&#x…...

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

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

华硕a豆14 Air香氛版,美学与科技的馨香融合

在快节奏的现代生活中&#xff0c;我们渴望一个能激发创想、愉悦感官的工作与生活伙伴&#xff0c;它不仅是冰冷的科技工具&#xff0c;更能触动我们内心深处的细腻情感。正是在这样的期许下&#xff0c;华硕a豆14 Air香氛版翩然而至&#xff0c;它以一种前所未有的方式&#x…...