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

BFS 解决多源最短路问题

文章目录

    • 多源BFS
    • 542. 01 矩阵
      • 题目解析
      • 算法原理
      • 代码实现
    • 1020. 飞地的数量
      • 题目解析
      • 算法原理
    • 1765. 地图中的最高点
      • 题目解析
      • 算法原理
      • 代码实现
    • 1162. 地图分析
      • 题目解析
      • 算法原理
      • 代码实现

多源BFS

单源最短路: 一个起点、一个终点

多源最短路: 可以多个起点,一个终点

多源BFS: 用BFS解决边权为1的多源最短路(😂)

BFS 解决边权为1的最短路问题

如何解决:

  • 解法一:暴力枚举,把多源最短路转换成若干个单源最短路(大概率超时)
  • 解法二:把所有源点当成一个“超级源点”,问题就变成了单一的单源最短路问题
    想办法将若干个起点,当作一个起点

为什么正确? 如图:

image-20240918223115848

如何代码实现:

  • 所有起点加入到队列当中
  • 一层一层向外扩展

542. 01 矩阵

题目链接:542. 01 矩阵

题目解析

给我们一个矩阵,矩阵由01组成

要我们返回的也是一个矩阵,里面放的是每个位置里0最近的距离

image-20240921185713717

算法原理

  • 把所有的0当成起点,1当成终点
  • 将所有0位置加入队列
  • 一层一层向外扩展

image-20240921190343166

代码实现

class Solution {
public:int dx[4] = {0, 0, 1, -1};int dy[4] = {1, -1, 0, 0};vector<vector<int>> updateMatrix(vector<vector<int>>& mat){int m = mat.size();int n = mat[0].size();vector<vector<int>> dist(m, vector<int>(n, -1));queue<pair<int, int>> q;for(int i = 0; i < m; i++){for(int j = 0; j < n; j++){if(mat[i][j] == 0){q.push({i, j});dist[i][j] = 0;}}}while(q.size()){auto [a, b] = q.front();q.pop();for(int k = 0; k < 4; k++){int x = dx[k] + a;int y = dy[k] + b;if(x >= 0 && x < m && y >= 0 && y < n && dist[x][y] == -1){dist[x][y] = dist[a][b] + 1;q.push({x, y});}}}return dist;}
};

1020. 飞地的数量

题目链接:1020. 飞地的数量

题目解析

给我们一个矩阵,由01组成,1表示陆地,0表示海洋

要我们求出,无法“上岸”数量

image-20240921191631941

算法原理

正难则反:

直接看四个边界,是否有“陆地”

如果有,直接往里面搜索,看有多少连在一起的

class Solution {
public:int dx[4] = {0, 0, 1, -1};int dy[4] = {1, -1, 0, 0};int numEnclaves(vector<vector<int>>& grid){int m = grid.size();int n = grid[0].size();vector<vector<bool>> vis(m, vector<bool>(n));queue<pair<int, int>> q;//四周 1 加入队列for(int j = 0; j < n; j++){if(grid[0][j] == 1) {q.push({0, j});vis[0][j] = true;}if(grid[m-1][j] == 1){q.push({m-1, j});vis[m-1][j] = true;}   }for(int i = 0; i < m; i++){if(grid[i][0] == 1){q.push({i, 0});vis[i][0] = true;}if(grid[i][n - 1] == 1){q.push({i, n-1});vis[i][n-1] = true;}}//多源bfswhile(q.size()){auto [a, b] = q.front();q.pop();for(int k = 0; k < 4; k++){int x = dx[k] + a;int y = dy[k] + b;if(x >= 0 && y >= 0 && x < m && y < n && grid[x][y] == 1 && !vis[x][y]){vis[x][y] = true;q.push({x, y});}}}int ret = 0;for(int i = 0; i < m; i++){for(int j = 0; j < n; j++){if(grid[i][j] == 1 && !vis[i][j])   ret++;}}return ret;}
};

1765. 地图中的最高点

题目链接:1765. 地图中的最高点

题目解析

给我们一个矩阵,由陆地水域组成

  • isWater[i][j] == 0为陆地
  • isWater[i][j] == 1为水域

规则如下:

  • 格子高度非负
  • 格子为水域,高度为0
  • 相邻格子,高度差不大于1

最终要得出,怎么排列,能得到让最高的高度最大。

算法原理

  • 这里最先排列的肯定是水域,如果是水域,设置为0,即先遍历矩阵,将水域格子加入队列
  • 然后一层一层向外扩展

image-20240921195430338

代码实现

class Solution {
public:int dx[4] = {1, -1, 0, 0};int dy[4] = {0, 0, 1, -1};vector<vector<int>> highestPeak(vector<vector<int>>& isWater){int m = isWater.size();int n = isWater[0].size();vector<vector<int>> dist(m,vector<int>(n, -1));queue<pair<int, int>> q;for(int i = 0; i < m; i++){for(int j = 0; j < n; j++){if(isWater[i][j] == 1){dist[i][j] = 0;q.push({i, j});}}}while(q.size()){auto [a, b] = q.front();q.pop();for(int k = 0; k < 4; k++){int x = dx[k] + a;int y = dy[k] + b;if(x >= 0 && x < m && y >= 0 && y < n && dist[x][y] == -1){dist[x][y] = dist[a][b] + 1;q.push({x, y});}}}return dist;}
};

1162. 地图分析

题目链接:1162. 地图分析

题目解析

给我一个矩阵,01组成

  • 0表示海洋
  • 1表示陆地

要我们找出海洋离陆地的最大距离(曼哈顿距离, a+b)

image-20240921200642023

算法原理

反过来,陆地到海洋的距离,一层一层往外扩

  • 陆地加入队列,此时距离为1
  • 往外扩展

代码实现

class Solution {
public:int dx[4] = {0, 0, -1, 1};int dy[4] = {1, -1, 0 ,0};int maxDistance(vector<vector<int>>& grid){int m = grid.size();int n = grid[0].size();vector<vector<int>> dist(m, vector<int>(n, -1));queue<pair<int, int>> q;for(int i = 0; i < m; i++){for(int j = 0; j < n; j++){if(grid[i][j] == 1){dist[i][j] = 0;q.push({i, j});}}}int ret = -1;while(q.size()){auto [a, b] = q.front();q.pop();for(int k = 0; k < 4; k++){int x = dx[k] + a;int y = dy[k] + b;if(x >= 0 && x < m && y >= 0 && y < n && dist[x][y] == -1){dist[x][y] = dist[a][b] + 1;q.push({x, y});ret = dist[x][y];}} }return ret;}
};

相关文章:

BFS 解决多源最短路问题

文章目录 多源BFS542. 01 矩阵题目解析算法原理代码实现 1020. 飞地的数量题目解析算法原理 1765. 地图中的最高点题目解析算法原理代码实现 1162. 地图分析题目解析算法原理代码实现 多源BFS 单源最短路&#xff1a; 一个起点、一个终点 多源最短路&#xff1a; 可以多个起点…...

论文笔记:交替单模态适应的多模态表征学习

整理了CVPR2024 Multimodal Representation Learning by Alternating Unimodal Adaptation&#xff09;论文的阅读笔记 背景MLA框架实验Q1 与之前的方法相比&#xff0c;MLA能否克服模态懒惰并提高多模态学习性能?Q2 MLA在面临模式缺失的挑战时表现如何?Q3 所有模块是否可以有…...

鸿蒙OS 线程间通信

鸿蒙OS 线程间通信概述 在开发过程中&#xff0c;开发者经常需要在当前线程中处理下载任务等较为耗时的操作&#xff0c;但是又不希望当前的线程受到阻塞。此时&#xff0c;就可以使用 EventHandler 机制。EventHandler 是 HarmonyOS 用于处理线程间通信的一种机制&#xff0c…...

执行 npm报错 Cannot find module ‘../lib/cli.js‘

报错 /usr/local/node/node-v18.20.4-linux-x64/bin/npm node:internal/modules/cjs/loader:1143 throw err; ^ Error: Cannot find module ../lib/cli.js Require stack: - /usr/local/node/node-v18.20.4-linux-x64/bin/npm at Module._resolveFilename (node:inter…...

基于SpringBoot+Vue+MySQL的国产动漫网站

系统展示 用户前台界面 管理员后台界面 系统背景 随着国内动漫产业的蓬勃发展和互联网技术的快速进步&#xff0c;动漫爱好者们对高质量、个性化的国产动漫内容需求日益增长。然而&#xff0c;市场上现有的动漫平台大多以国外动漫为主&#xff0c;对国产动漫的推广和展示存在不…...

AUTOSAR汽车电子嵌入式编程精讲300篇-基于CAN总线的气动控制

目录 前言 知识储备 什么是气动控制: 气动控制基础知识 一、气动元件 二、气路设计 三、气动控制系统 气动控制系统构成图 气动控制系统基本组成功能图 几种常见的气动执行元件实物图 常用气动压力控制阀实物图 常用气动流动控制阀实物图 电磁控制换向发实物图 部…...

Ubuntu 20.04 内核升级后网络丢失问题的解决过程

在 Ubuntu 系统中&#xff0c;内核升级是一个常见的操作&#xff0c;旨在提升系统性能、安全性和兼容性。然而&#xff0c;有时这一操作可能会带来一些意外的副作用&#xff0c;比如导致网络功能的丧失。 本人本来是想更新 Nvidia 显卡的驱动&#xff0c;使用 ubuntu-drivers …...

论文解读《LaMP: When Large Language Models Meet Personalization》

引言&#xff1a;因为导师喊我围绕 “大语言模型的个性化、风格化生成” 展开研究&#xff0c;所以我就找相关论文&#xff0c;最后通过 ACL 官网找到这篇&#xff0c;感觉还不错&#xff0c;就开始解读吧&#xff01; “说是解读&#xff0c;其实大部分都是翻译哈哈哈&#x…...

Excel VLOOKUP函数怎么用?vlookup函数的使用方法及案例

大家好&#xff0c;这里是效率办公指南&#xff01; &#x1f50e; 在Excel的世界里&#xff0c;VLOOKUP函数无疑是查询和数据分析中的明星。无论是从庞大的数据表中提取特定信息&#xff0c;还是进行数据的快速匹配&#xff0c;VLOOKUP都能大显身手。今天&#xff0c;我们将深…...

专为汽车功能应用打造的 MLX90376GGO、MLX90377GGO、MLX90377GDC-ADB-280 Triaxis®磁位置传感器 IC

一、MLX90376 Triaxis堆叠式高性能位置传感器芯片&#xff08;模拟/PWM/SENT/SPC&#xff09; MLX90376GGO-ABA-600 MLX90376GGO-ABA-630 MLX90376GGO-ABA-680 MLX90376是一款磁性绝对位置传感器芯片&#xff0c;适用于要求具备抗杂散磁场干扰性能的360旋转汽车应用。它提供…...

34.贪心算法1

0.贪心算法 1.柠檬水找零&#xff08;easy&#xff09; . - 力扣&#xff08;LeetCode&#xff09; 题目解析 算法原理 代码 class Solution {public boolean lemonadeChange(int[] bills) {int five 0, ten 0;for (int x : bills) {if (x 5) // 5 元&#xff1a;直接收下…...

DataX实战:从MongoDB到MySQL的数据迁移--修改源码并测试打包

在现代数据驱动的业务环境中&#xff0c;数据迁移和集成是常见的需求。DataX&#xff0c;作为阿里云开源的数据集成工具&#xff0c;提供了强大的数据同步能力&#xff0c;支持多种数据源和目标端。本文将介绍如何使用DataX将数据从MongoDB迁移到MySQL。 环境准备 安装MongoDB…...

Axure设计之表格列冻结(动态面板+中继器)

在Web端产品设计中&#xff0c;复杂的表格展示是常见需求&#xff0c;尤其当表格包含大量列时&#xff0c;如何在有限的屏幕空间内优雅地展示所有信息成为了一个挑战。用户通常需要滚动查看隐藏列&#xff0c;但关键信息列&#xff08;如ID、操作按钮等&#xff09;在滚动时保持…...

WPF DataGrid 动态修改某一个单元格的样式

WPF DataGrid 动态修改某一个单元格的样式 <DataGrid Name"main_datagrid_display" Width"1267" Height"193" Grid.Column"1"ItemsSource"{Binding DataGridModels}"><DataGrid.Columns><!--ElementStyle 设…...

如何安装部署kafka

安装和部署Apache Kafka需要以下几个步骤&#xff0c;包括下载 Kafka、配置 ZooKeeper&#xff08;或者使用 Kafka 自带的 Kafka Raft 模式替代 ZooKeeper&#xff09;&#xff0c;以及启动 Kafka 服务。以下是一个但基于 Linux 的典型安装流程&#xff0c;可以根据需要改装到其…...

Centos7-rpm包管理器方式安装MySQL 5.7.25

前言 本文用于学习通过Mysql压缩包在centos7中安装和配置的过程以及过程中碰到的Bug解决。 Mysql安装包下载和上传 MySQL :: Download MySQL Community Server (Archived Versions)https://downloads.mysql.com/archives/community/访问Mysql官方下载站&#xff0c;选择对应的…...

Project Online 协作版部署方案

目录 前言 第一部分:为什么选择Project Online? 一、核心优势 二、适用场景 第二部分:部署前的准备工作 一、需求分析 二、账户和权限管理 三、培训与支持 第三部分:Project Online 的核心功能 一、项目创建与管理 二、资源管理 三、团队协作 四、风险管理 五…...

小米 13 Ultra机型工程固件 资源预览与刷写说明 步骤解析

小米 13 Ultra机型---机型代码为ishtar 。工程固件可以辅助修复格机或者全檫除分区后的基带修复。可以用于修复TEE损坏。以及一些分区的底层修复。此款固件也可以为更换UFS后的底包。 通过博文了解 1💝💝💝-----此机型工程固件的资源刷写注意事项 2💝💝💝-----此…...

Goweb预防XSS攻击

XSS攻击示例 假设您有一个简单的Web应用程序&#xff0c;其中包含一个用户输入表单&#xff0c;用户可以在其中输入他们的名字&#xff0c;然后这个名字会被显示在页面上。攻击者可以在表单中输入恶意的JavaScript代码&#xff0c;如&#xff0c;如果应用程序没有对这个输入进…...

ICM20948 DMP代码详解(36)

接前一篇文章&#xff1a;ICM20948 DMP代码详解&#xff08;35&#xff09; 上一回讲到了icm20948_sensor_setup() ---> inv_icm20948_initialize_auxiliary函数 ---> inv_icm20948_set_slave_compass_id函数&#xff0c;本回开始&#xff0c;就对于inv_icm20948_set_sla…...

别再让UI卡死了!WPF开发中Dispatcher.Invoke和BeginInvoke的保姆级避坑指南

别再让UI卡死了&#xff01;WPF开发中Dispatcher.Invoke和BeginInvoke的保姆级避坑指南 当你在WPF应用中点击一个按钮后界面突然冻结&#xff0c;进度条卡在50%不再前进&#xff0c;鼠标变成旋转的沙漏——这种糟糕的用户体验往往源于错误的线程调度方式。作为C#开发者&#xf…...

C#实战:5分钟搞定Modbus RTU通讯(基于NModbus4库)

C#实战&#xff1a;5分钟搞定Modbus RTU通讯&#xff08;基于NModbus4库&#xff09; 工业自动化领域的数据采集离不开设备通讯协议的支持&#xff0c;而Modbus RTU作为最广泛应用的串行通信协议之一&#xff0c;几乎成为工控开发者的必修课。今天我们就用C#和NModbus4库&#…...

终极指南:LitmusChaos从混沌测试到智能韧性工程的完整演进路径

终极指南&#xff1a;LitmusChaos从混沌测试到智能韧性工程的完整演进路径 【免费下载链接】litmus 一个用于Kubernetes的云原生Chaos Engineering框架&#xff0c;用于测试系统的健壮性和弹性。 - 功能&#xff1a;Chaos Engineering&#xff1b;系统测试&#xff1b;Kubernet…...

Cookie 和 Session 分别存储在客户端还是服务端?

从“存包凭条”到“后台存包柜”&#xff1a;Cookie 与 Session 的存储位置深度剖析1. 引言&#xff1a;超市存包处的“凭条”与“存包柜”2. 前置知识&#xff1a;HTTP 的“健忘症”3. Cookie&#xff1a;客户端的“小凭条”3.1 是什么&#xff1f;3.2 解决什么问题&#xff1…...

OpenClaw本地搜索增强:GLM-4.7-Flash智能文件检索系统

OpenClaw本地搜索增强&#xff1a;GLM-4.7-Flash智能文件检索系统 1. 为什么需要智能文件检索 作为一个长期被杂乱文件困扰的技术写作者&#xff0c;我经常陷入"明明记得存过某个文档却死活找不到"的困境。传统的文件名搜索就像在黑暗房间里用手电筒找东西——必须…...

告别Moom!用Hammerspoon实现Mac窗口精准控制(附完整快捷键表+配置文件)

用Hammerspoon打造Mac高效工作流&#xff1a;从窗口管理到自动化脚本 每次看到同事花十几秒拖动窗口调整大小&#xff0c;或者在不同显示器间来回切换应用时&#xff0c;我总忍不住想分享这个改变我工作效率的神器。Hammerspoon——这个完全免费的开源工具&#xff0c;让我彻底…...

Xilinx FPGA FIFO IP核复位机制深度解析与实战调试

1. Xilinx FPGA FIFO IP核复位机制基础解析 第一次接触Xilinx FPGA的FIFO IP核时&#xff0c;很多人都会在复位环节栽跟头。我刚开始用Vivado生成FIFO IP核时&#xff0c;就遇到过复位信号处理不当导致数据丢失的问题。FIFO&#xff08;First In First Out&#xff09;作为数据…...

python vue医院健康体检系统

目录技术选型与架构设计核心模块划分关键功能实现安全与合规措施部署方案开发里程碑计划项目技术支持源码获取详细视频演示 &#xff1a;文章底部获取博主联系方式&#xff01;同行可合作技术选型与架构设计 后端采用Python的Django框架&#xff0c;提供RESTful API接口。Djan…...

LM339比较器实战:手把手教你搭建电池电压监测电路(附电路图)

LM339比较器实战&#xff1a;手把手教你搭建电池电压监测电路&#xff08;附电路图&#xff09; 1. 为什么选择LM339作为电池监测核心器件&#xff1f; 在电子设计领域&#xff0c;电压监测是保障设备稳定运行的基础功能之一。LM339作为一款经典的四路电压比较器&#xff0c;…...

ASan实战:5种常见内存错误诊断与修复指南(附GCC/Clang编译命令)

ASan实战&#xff1a;5种常见内存错误诊断与修复指南&#xff08;附GCC/Clang编译命令&#xff09; 在C/C开发中&#xff0c;内存错误如同潜伏的暗礁&#xff0c;随时可能让程序沉没。AddressSanitizer&#xff08;ASan&#xff09;作为Google推出的内存错误检测工具&#xff…...