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

详细介绍:我爱学算法之—— 多源BFS

前言

所谓多源BFS,简单来说就从多个起点开始遍历。

一、01 矩阵

题目解析

在这里插入图片描述

给定一个由01组成的矩阵,要输出一个大小相同的矩阵,结果矩阵中每一个格子都是mat中对应位置到最近的0的距离。

算法思路

这道题如果从1位置开始遍历,那就只能一个一个进行BFS求到最近的0的距离,那未免也太复杂的。

但如果从0位置开始遍历,我们就可以在一开始将所有的0位置放入到队列中,同时进行BFS,并且择优选择(统计每个位置是否遍历过,去重);

这样进行多源BFS后,1位置对应结果矩阵中的值就是该位置到最近0的距离。

代码实现

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

二、飞地的数量

题目解析

在这里插入图片描述

这道题和被围绕的区域非常类似,都是找围绕的区域;这里要求被围绕区域的陆地单元格个数。

算法思路

这道题思路也很明了了,先进行边缘处理,从边缘位置中的1开始进行BFS遍历,进行标记,然后统计没有被标记的1的个数即可。

但这里边缘位置的1有很多,这里也不需要一个一个进行BFS遍历,直接将所有边缘的1的下标放入队列中,进行多源BFS即可。

标记边界连通的陆地

  • 遍历矩阵的四条边界,将所有边界上的陆地(值为 1)加入队列,并标记为 0。
  • 通过 BFS 从这些边界陆地出发,向四周扩散,将所有能连通到边界的陆地标记为 0。

统计剩余陆地

  • 遍历整个矩阵,统计值仍为 1 的格子数量,即为飞地数量。

代码实现

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

三、地图中的最高点

题目解析

在这里插入图片描述

这道题是要根据给定的m×n整数矩阵isWater(0 表示陆地、1 表示水域),给每个格子安排非负高度,满足:水域高度必须为 0;相邻格子(正东、南、西、北方向)高度差至多为 1。最终要找出使矩阵最高高度最大的高度安排方案,返回对应的高度矩阵height

算法思路

对于这道题,就不能像上面那样一次一次进行BFS遍历能解决了;

这里就只能同时从多个0位置开始遍历,让相邻格子的高度比当前位置高度大1

多源BFS

代码实现

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

四、地图分析

题目解析

在这里插入图片描述

这道题是要在 n×n 的网格 grid 中(0 代表海洋,1 代表陆地),找出一个海洋单元格,使得它到离它最近的陆地单元格的曼哈顿距离最大,返回这个最大距离。如果网格只有陆地或只有海洋,返回 -1。

算法思路

对于这道题,就要从所有的1陆地,进行多源BFS遍历。

多源BFS

代码实现

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

本篇文章到这里就结束了,感谢支持
我的博客即将同步至腾讯云开发者社区,邀请大家一同入驻:https://cloud.tencent.com/developer/support-plan?invite_code=2oul0hvapjsws

http://www.gsyq.cn/news/124754.html

相关文章:

  • 2025年定制衣柜橱柜实力厂家权威推荐榜单:全屋定制/家具全屋定制/定制餐边柜源头厂家精选 - 品牌推荐官
  • 权威精选!中国电线电缆品牌推荐,安全可靠的传伙伴输 - 黑马榜单
  • 2025年GEO优化服务商排行榜及选择建议 - 品牌推荐排行榜
  • 实验室超纯水器选购指南:国产优选企业深度解析 - 品牌推荐大师
  • 136_尚硅谷_Go时间和日期函数详解(2)
  • 2025年GEO优化服务商推荐及选择指南 - 品牌推荐排行榜
  • 2025年GEO优化服务商推荐与选择指南 - 品牌推荐排行榜
  • 2025年厂房环保工程服务商推荐:聚焦洁净车间与绿色生产解决方案 - 品牌2025
  • 2025年GEO优化服务商选型指南:四大维度精准匹配企业需求 - 品牌推荐排行榜
  • 2025年12月试验机厂家权威推荐榜:拉力/拉伸/强度/橡胶拉伸/波纹管压力/金属材料/端子/塑料/环刚度/电子式万能/复合材料拉力试验机,精准测控与耐用品质之选 - 品牌企业推荐师(官方)
  • 2025年GEO优化服务商综合实力排行榜及选型指南 - 品牌推荐排行榜
  • c++实验六
  • 2025年中压电缆优质厂家权威推荐榜单:防火电缆/电线电缆/控制电缆源头厂家精选 - 品牌推荐官
  • 2025年数控激光切割机定做厂家权威推荐榜单:小型激光切割机/激光切割设备/管材激光切割机源头厂家精选 - 品牌推荐官
  • 实用指南:企业级部署升级:Nginx 反向代理 + ELK 日志监控,让成绩预测平台稳定可追溯
  • 2025年除冰剂供货厂家推荐榜单:除冰融雪剂/融雪设备/氯化钠融雪剂源头厂家精选 - 品牌推荐官
  • 解决Docker磁盘空间告急:认识并清理“悬空镜像”
  • 日本股票 API 对接实战指南(实时行情与 IPO 专题)
  • 2025年12月拉力机与冲片机厂家权威推荐榜:电子/电脑/双柱/橡胶/线材/薄膜拉力机,手动/气动/电动冲片机,精准耐用工业之选 - 品牌企业推荐师(官方)
  • 前端工程化体系深度设计
  • 邮件网关哪个好?2025邮件网关产品推荐 - U-Mail邮件系统
  • 《lvgl基础学习 —— lv_style》
  • 实战两台 Windows 电脑互联传输文件
  • 2025年行业内诚信的制冷设备生产厂家推荐榜,冷却塔/方形逆流冷却塔/工业冷却塔/冷却水塔/冷却塔填料/圆形逆流冷却塔制冷设备公司联系电话 - 品牌推荐师
  • 想刷到特价机票?2025这些平台容易遇到低价,也省心! - 资讯焦点
  • 2025年12月滨海新区装修公司排名top5:佰瑞佳垄断高端别墅大平层装修市场 - 品牌智鉴榜
  • redis-ai
  • 完整教程:电脑硬件解剖,拆解主流机型,分享硬件升级与故障排查经验
  • 2025-2026权威盘点:靠谱的国际博士报读渠道8大口碑好的国际博士服务商深度测评 - 阿喂嘞lvv
  • 2025年高活性NMN品牌推荐与市场动态,NMN年度报告榜单,口服品牌评测 - 资讯焦点