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

蓝桥杯算法之搜索章 - 7

大家好,不同的时间,相同的地点!又和大家见面了,接下来我将带来多源BFS的内容

通过多源BFS的学习,大家将对BFS理解更加深入!

let's go!

前言

通过前面内容的学习,大家肯定已经对于BFS有了一定理解,但是在某些题目中,我们前面学习的BFS却不能很好的解决我们的问题。

大家可以想象一下:你从迷宫中心的起点出发,不是孤身一人,而是召集了所有出口的“斥候”同时起跑,他们沿着每一条岔路疾驰,彼此提醒“这条路我已走过”。下一秒,最短的欢呼声从终点传来——这就是多源 BFS 的魔法。它让“单点扩散”瞬间升级为“万箭齐发”,把最短路问题从“找一条路”变成“听最早响起的回声”。读完这篇博客,你会明白如何让算法像闪电一样,从四面八方向答案合围!

一、多源BFS

1.单源最短路问题 vs 多源最短路问题

1、当问题中只存在一个起点时,这时的最短路问题就是单源最短路问题。

2、当问题中存在多个起点而不是单一起点时,这时的最短路问题就是多源最短路问题。

2.多源BFS

多源最短路问题的边权都为1的时候,此时就可以用多源BFS来解决。

3.解决方式

把这些源点汇聚在一起时,当成一个“超级源点”。然后从这个“超级源点”开始,处理最短路问题。落实到代码上就是:

1.初始化的时候,把所有的源点都加入到队列里面

2.然后正常执行bfs的逻辑即可

也就是在初始化的时候,比普通的bfs多加入几个起点

二、题目概略

矩阵距离

三、矩阵距离

题目展示:

思路分析:

曼哈顿距离:

对于曼哈顿距离我们有两种方法来计算:

1.通过坐标计算

2.通过求两点之间的最短路径长度来计算

所以我们可以通过BFS来计算其中的最短路径长度

我们有两种思路去解决这道题:

1.直接从前往后开始遍历,找到0,然后通过它来做一次bfs。找到最短路径长度
弊端:时间复杂度很高

2.正难则反,我们去找1,将这些1当做一个大源点,然后去找0,找到了就更新对应的距离。做一次BFS就可以解决

在这里,我就实现第二种方法了:

如何存放矩阵?

由于只存放1,0这种数,我们使用一个char a[][]的数组来存放数据即可。

如何存放最短距离?

再使用一个int dist[N][N];来存放最短距离

接下来的实现就只是比简单的BFS多了一部分,难度不大,我们直接来实现一下代码看看:

代码实现:

#include <iostream>
#include <queue>
#include <cstring>
using namespace std;
const int N = 1e3 + 10;
char a[N][N];
int dist[N][N];
int n, m;
typedef pair<int, int> PII;//存放坐标
//用于移动
int dx[] = {0, 0, 1, -1};
int dy[] = {1, -1, 0, 0};
void bfs()
{memset(dist, -1, sizeof(dist));//初始化dist数组为-1,避免出现歧义queue<PII> q;//多源BFSfor (int i = 1; i <= n; i++){for (int j = 1; j <= m; j++){if (a[i][j] == '1'){q.push({i, j});dist[i][j] = 0;}}}while(q.size()){PII t = q.front(); q.pop();int i = t.first, j = t.second;for (int k = 0; k < 4; k++){int x = i + dx[k];int y = j + dy[k];if (x < 1 || x > n || y < 1 || y > m) continue;//超出矩阵,直接跳过if (a[x][y] == '1') continue;//是1不是0也跳过if (dist[x][y] != -1) continue;//被填过最短距离,就跳过dist[x][y] = dist[i][j] + 1;//更新最短距离q.push({x, y});}}}
int main()
{cin >> n >> m;for (int i = 1; i <= n; i++){for (int j = 1; j <= m; j++){cin >> a[i][j];}}bfs();for (int i = 1; i <= n; i++){for (int j = 1; j <= m; j++){cout << dist[i][j] << " ";}cout << endl;}return 0;
}

总结

在多源BFS中,只是多了将初始化的时候,多放入了许多起点。

大体思路实现都是不会有太大的变化。

希望大家能够有所收获,多多点赞 + 收藏 + 关注!

http://www.dtcms.com/a/337338.html

相关文章:

  • LeetCode 45.跳跃游戏II:贪心策略下的最少跳跃次数求解
  • 华为云服务器从注册到部署全流程指南
  • Pomian语言处理器 研发笔记(一):使用C++的正则表达式构建词法分析器
  • 零基础数据结构与算法——第七章:算法实践与工程应用-图像处理
  • LLM - MCP传输协议解读:从SSE的单向奔赴到Streamable HTTP的双向融合
  • JavaScript 原型继承与属性访问规则详解
  • ES入门教程
  • CSDN转PDF【无水印且免费!!!】
  • linux 内核 - 进程地址空间的数据结构
  • 【STM32】STM32H750 CubeMX 配置 USB CDC 虚拟串口笔记
  • 保姆级教学:使用 Jenkins 部署前端项目(2025 年最新版)
  • 基于JS实现的中国象棋AI系统:多模块协同决策与分析
  • ffmpeg编译
  • 音视频面试题集锦第 26 期
  • 计算机网络-IPv6
  • 679. 24 点游戏
  • Android Cutout(屏幕挖孔)详解
  • ubuntu 编译ffmpeg6.1 增加drawtext,libx264,libx265等
  • Leetcode 3648. Minimum Sensors to Cover Grid
  • OCR库pytesseract安装保姆级教程
  • LeetCode:无重复字符的最长子串
  • SQLite 加密与不加密性能对比与优化实践
  • Opsqueue:为重负载而生的轻量级批处理队列,已开源!
  • 视频因为264问题无法网页播放,解决方案之一:转化视频
  • 智创飞跃|2025 Google 开发者大会伴你成长精进
  • 兴趣爱好——虾哥开源小智AI机器人搭建(丐版—最低成本)ESP32开发板 MicroPython V1.0.0 Rev1
  • 嵌入式Linux学习 -- 进程和线程4
  • 三高架构杂谈
  • Ansible 自动化运维实践笔记:Jinja2 模板、LNMP+WordPress 部署与大项目管理
  • 飞算JavaAI智慧校园场景实践:从校园管理到师生服务的全链路技术革新