蓝桥杯算法之搜索章 - 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中,只是多了将初始化的时候,多放入了许多起点。
大体思路实现都是不会有太大的变化。
希望大家能够有所收获,多多点赞 + 收藏 + 关注!