当前位置: 首页 > 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.lryc.cn/news/625200.html

相关文章:

  • OVS:除了Geneve和VXLAN,还有哪些虚拟化网络协议?
  • 【DL学习笔记】损失函数各个类别梳理
  • MacOS 安全机制与“文件已损坏”排查完整指南
  • LAMP 架构部署:Linux+Apache+MariaDB+PHP
  • LeetCode热题100--226. 翻转二叉树--简单
  • week2-[循环嵌套]数位和为m倍数的数
  • 重温 K8s 基础概念知识系列五(存储、配置、安全和策略)
  • NL2SQL 技术深度解析与项目实践
  • 在 PyCharm Notebook 中安装 YOLO
  • 抽象工厂设计模式 Abstract Factory
  • yum安装搭建lamp架构部署WordPress个人论坛
  • 美图披露半年报:AI应用取得突破,净利润同比大增71.3%
  • 上周60+TRO案件,波比的游戏时间/丹迪世界/飞盘/迪奥/多轮维权,手表/汽车品牌持续发力,垃圾桶专利等新增侵权风险!
  • 【MongoDB】多种聚合操作详解,案例分析
  • 启发式合并
  • powershell中的cmdlet
  • 【每日一题】Day 7
  • MySQL架构和储存引擎
  • Web安全 - 构建安全可靠的API:基于国密SM2/SM3的文件上传方案深度解析
  • 多智能体架构设计:从单Agent到复杂系统的演进逻辑
  • 人工智能 | 基于大数据的皮肤病症状数据可视化分析系统(matlab源码)
  • 发布npmjs组件库
  • AopAutoConfiguration源码阅读
  • 鼠标右键没有“通过VSCode打开文件夹”
  • JVM学习笔记-----类加载
  • FPGA-Vivado2017.4-建立AXI4用于单片机与FPGA之间数据互通
  • Google 的 Opal:重新定义自动化的 AI 平台
  • WPF 打印报告图片大小的自适应(含完整示例与详解)
  • Rust 入门 生命周期-next2 (十九)
  • 牛津大学xDeepMind 自然语言处理(1)