BFS 解决多源最短路问题
文章目录
- 多源BFS
- 542. 01 矩阵
- 题目解析
- 算法原理
- 代码实现
- 1020. 飞地的数量
- 题目解析
- 算法原理
- 1765. 地图中的最高点
- 题目解析
- 算法原理
- 代码实现
- 1162. 地图分析
- 题目解析
- 算法原理
- 代码实现
多源BFS
单源最短路: 一个起点、一个终点
多源最短路: 可以多个起点,一个终点
多源BFS: 用BFS解决边权为1的多源最短路(😂)
BFS 解决边权为1的最短路问题
如何解决:
- 解法一:暴力枚举,把多源最短路转换成若干个单源最短路(大概率超时)
- 解法二:把所有源点当成一个“超级源点”,问题就变成了单一的单源最短路问题
想办法将若干个起点,当作一个起点
为什么正确? 如图:

如何代码实现:
- 所有起点加入到队列当中
- 一层一层向外扩展
542. 01 矩阵
题目链接:542. 01 矩阵
题目解析
给我们一个矩阵,矩阵由0和1组成
要我们返回的也是一个矩阵,里面放的是每个位置里0最近的距离

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

代码实现
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. 飞地的数量
题目解析
给我们一个矩阵,由0和1组成,1表示陆地,0表示海洋
要我们求出,无法“上岸”数量

算法原理
正难则反:
直接看四个边界,是否有“陆地”
如果有,直接往里面搜索,看有多少连在一起的
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,即先遍历矩阵,将水域格子加入队列 - 然后一层一层向外扩展

代码实现
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. 地图分析
题目解析
给我一个矩阵,0和1组成
0表示海洋1表示陆地
要我们找出海洋离陆地的最大距离(曼哈顿距离, a+b)

算法原理
反过来,陆地到海洋的距离,一层一层往外扩
- 陆地加入队列,此时距离为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 单源最短路: 一个起点、一个终点 多源最短路: 可以多个起点…...
论文笔记:交替单模态适应的多模态表征学习
整理了CVPR2024 Multimodal Representation Learning by Alternating Unimodal Adaptation)论文的阅读笔记 背景MLA框架实验Q1 与之前的方法相比,MLA能否克服模态懒惰并提高多模态学习性能?Q2 MLA在面临模式缺失的挑战时表现如何?Q3 所有模块是否可以有…...
鸿蒙OS 线程间通信
鸿蒙OS 线程间通信概述 在开发过程中,开发者经常需要在当前线程中处理下载任务等较为耗时的操作,但是又不希望当前的线程受到阻塞。此时,就可以使用 EventHandler 机制。EventHandler 是 HarmonyOS 用于处理线程间通信的一种机制,…...
执行 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的国产动漫网站
系统展示 用户前台界面 管理员后台界面 系统背景 随着国内动漫产业的蓬勃发展和互联网技术的快速进步,动漫爱好者们对高质量、个性化的国产动漫内容需求日益增长。然而,市场上现有的动漫平台大多以国外动漫为主,对国产动漫的推广和展示存在不…...
AUTOSAR汽车电子嵌入式编程精讲300篇-基于CAN总线的气动控制
目录 前言 知识储备 什么是气动控制: 气动控制基础知识 一、气动元件 二、气路设计 三、气动控制系统 气动控制系统构成图 气动控制系统基本组成功能图 几种常见的气动执行元件实物图 常用气动压力控制阀实物图 常用气动流动控制阀实物图 电磁控制换向发实物图 部…...
Ubuntu 20.04 内核升级后网络丢失问题的解决过程
在 Ubuntu 系统中,内核升级是一个常见的操作,旨在提升系统性能、安全性和兼容性。然而,有时这一操作可能会带来一些意外的副作用,比如导致网络功能的丧失。 本人本来是想更新 Nvidia 显卡的驱动,使用 ubuntu-drivers …...
论文解读《LaMP: When Large Language Models Meet Personalization》
引言:因为导师喊我围绕 “大语言模型的个性化、风格化生成” 展开研究,所以我就找相关论文,最后通过 ACL 官网找到这篇,感觉还不错,就开始解读吧! “说是解读,其实大部分都是翻译哈哈哈&#x…...
Excel VLOOKUP函数怎么用?vlookup函数的使用方法及案例
大家好,这里是效率办公指南! 🔎 在Excel的世界里,VLOOKUP函数无疑是查询和数据分析中的明星。无论是从庞大的数据表中提取特定信息,还是进行数据的快速匹配,VLOOKUP都能大显身手。今天,我们将深…...
专为汽车功能应用打造的 MLX90376GGO、MLX90377GGO、MLX90377GDC-ADB-280 Triaxis®磁位置传感器 IC
一、MLX90376 Triaxis堆叠式高性能位置传感器芯片(模拟/PWM/SENT/SPC) MLX90376GGO-ABA-600 MLX90376GGO-ABA-630 MLX90376GGO-ABA-680 MLX90376是一款磁性绝对位置传感器芯片,适用于要求具备抗杂散磁场干扰性能的360旋转汽车应用。它提供…...
34.贪心算法1
0.贪心算法 1.柠檬水找零(easy) . - 力扣(LeetCode) 题目解析 算法原理 代码 class Solution {public boolean lemonadeChange(int[] bills) {int five 0, ten 0;for (int x : bills) {if (x 5) // 5 元:直接收下…...
DataX实战:从MongoDB到MySQL的数据迁移--修改源码并测试打包
在现代数据驱动的业务环境中,数据迁移和集成是常见的需求。DataX,作为阿里云开源的数据集成工具,提供了强大的数据同步能力,支持多种数据源和目标端。本文将介绍如何使用DataX将数据从MongoDB迁移到MySQL。 环境准备 安装MongoDB…...
Axure设计之表格列冻结(动态面板+中继器)
在Web端产品设计中,复杂的表格展示是常见需求,尤其当表格包含大量列时,如何在有限的屏幕空间内优雅地展示所有信息成为了一个挑战。用户通常需要滚动查看隐藏列,但关键信息列(如ID、操作按钮等)在滚动时保持…...
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需要以下几个步骤,包括下载 Kafka、配置 ZooKeeper(或者使用 Kafka 自带的 Kafka Raft 模式替代 ZooKeeper),以及启动 Kafka 服务。以下是一个但基于 Linux 的典型安装流程,可以根据需要改装到其…...
Centos7-rpm包管理器方式安装MySQL 5.7.25
前言 本文用于学习通过Mysql压缩包在centos7中安装和配置的过程以及过程中碰到的Bug解决。 Mysql安装包下载和上传 MySQL :: Download MySQL Community Server (Archived Versions)https://downloads.mysql.com/archives/community/访问Mysql官方下载站,选择对应的…...
Project Online 协作版部署方案
目录 前言 第一部分:为什么选择Project Online? 一、核心优势 二、适用场景 第二部分:部署前的准备工作 一、需求分析 二、账户和权限管理 三、培训与支持 第三部分:Project Online 的核心功能 一、项目创建与管理 二、资源管理 三、团队协作 四、风险管理 五…...
小米 13 Ultra机型工程固件 资源预览与刷写说明 步骤解析
小米 13 Ultra机型---机型代码为ishtar 。工程固件可以辅助修复格机或者全檫除分区后的基带修复。可以用于修复TEE损坏。以及一些分区的底层修复。此款固件也可以为更换UFS后的底包。 通过博文了解 1💝💝💝-----此机型工程固件的资源刷写注意事项 2💝💝💝-----此…...
Goweb预防XSS攻击
XSS攻击示例 假设您有一个简单的Web应用程序,其中包含一个用户输入表单,用户可以在其中输入他们的名字,然后这个名字会被显示在页面上。攻击者可以在表单中输入恶意的JavaScript代码,如,如果应用程序没有对这个输入进…...
ICM20948 DMP代码详解(36)
接前一篇文章:ICM20948 DMP代码详解(35) 上一回讲到了icm20948_sensor_setup() ---> inv_icm20948_initialize_auxiliary函数 ---> inv_icm20948_set_slave_compass_id函数,本回开始,就对于inv_icm20948_set_sla…...
业务系统对接大模型的基础方案:架构设计与关键步骤
业务系统对接大模型:架构设计与关键步骤 在当今数字化转型的浪潮中,大语言模型(LLM)已成为企业提升业务效率和创新能力的关键技术之一。将大模型集成到业务系统中,不仅可以优化用户体验,还能为业务决策提供…...
线程与协程
1. 线程与协程 1.1. “函数调用级别”的切换、上下文切换 1. 函数调用级别的切换 “函数调用级别的切换”是指:像函数调用/返回一样轻量地完成任务切换。 举例说明: 当你在程序中写一个函数调用: funcA() 然后 funcA 执行完后返回&…...
iPhone密码忘记了办?iPhoneUnlocker,iPhone解锁工具Aiseesoft iPhone Unlocker 高级注册版分享
平时用 iPhone 的时候,难免会碰到解锁的麻烦事。比如密码忘了、人脸识别 / 指纹识别突然不灵,或者买了二手 iPhone 却被原来的 iCloud 账号锁住,这时候就需要靠谱的解锁工具来帮忙了。Aiseesoft iPhone Unlocker 就是专门解决这些问题的软件&…...
屋顶变身“发电站” ,中天合创屋面分布式光伏发电项目顺利并网!
5月28日,中天合创屋面分布式光伏发电项目顺利并网发电,该项目位于内蒙古自治区鄂尔多斯市乌审旗,项目利用中天合创聚乙烯、聚丙烯仓库屋面作为场地建设光伏电站,总装机容量为9.96MWp。 项目投运后,每年可节约标煤3670…...
2025盘古石杯决赛【手机取证】
前言 第三届盘古石杯国际电子数据取证大赛决赛 最后一题没有解出来,实在找不到,希望有大佬教一下我。 还有就会议时间,我感觉不是图片时间,因为在电脑看到是其他时间用老会议系统开的会。 手机取证 1、分析鸿蒙手机检材&#x…...
select、poll、epoll 与 Reactor 模式
在高并发网络编程领域,高效处理大量连接和 I/O 事件是系统性能的关键。select、poll、epoll 作为 I/O 多路复用技术的代表,以及基于它们实现的 Reactor 模式,为开发者提供了强大的工具。本文将深入探讨这些技术的底层原理、优缺点。 一、I…...
【JavaWeb】Docker项目部署
引言 之前学习了Linux操作系统的常见命令,在Linux上安装软件,以及如何在Linux上部署一个单体项目,大多数同学都会有相同的感受,那就是麻烦。 核心体现在三点: 命令太多了,记不住 软件安装包名字复杂&…...
IP如何挑?2025年海外专线IP如何购买?
你花了时间和预算买了IP,结果IP质量不佳,项目效率低下不说,还可能带来莫名的网络问题,是不是太闹心了?尤其是在面对海外专线IP时,到底怎么才能买到适合自己的呢?所以,挑IP绝对是个技…...
使用Spring AI和MCP协议构建图片搜索服务
目录 使用Spring AI和MCP协议构建图片搜索服务 引言 技术栈概览 项目架构设计 架构图 服务端开发 1. 创建Spring Boot项目 2. 实现图片搜索工具 3. 配置传输模式 Stdio模式(本地调用) SSE模式(远程调用) 4. 注册工具提…...
【Nginx】使用 Nginx+Lua 实现基于 IP 的访问频率限制
使用 NginxLua 实现基于 IP 的访问频率限制 在高并发场景下,限制某个 IP 的访问频率是非常重要的,可以有效防止恶意攻击或错误配置导致的服务宕机。以下是一个详细的实现方案,使用 Nginx 和 Lua 脚本结合 Redis 来实现基于 IP 的访问频率限制…...
