C++多源BFS(Multiple Source BFS)是一种基于广度优先搜索的算法,用于在一个图中找到多个起点到达同一个目标点的最短路径。
具体实现步骤如下:
1.初始化:将所有起点的坐标加入队列,并将它们的距离设为0。
2.进行BFS:从队列中取出一个起点,遍历其周围的点,若该点未被访问过,则将其加入队列中,并更新它的距离为当前起点的距离+1。
3.终止条件:当队列为空时,搜索结束。
4.返回结果:返回目标点的距离。
#include<iostream>
#include<queue>
#include<vector>
using namespace std;
const int N = 100010;
int h[N], e[N], ne[N], idx;
int dist[N];
int n, m;
void add(int a, int b)
{
e[idx] = b; ne[idx] = h[a]; h[a] = idx ++;
}
int bfs()
{
queue<int> q;
for (int i = 1; i <= n; i ++ )
if (dist[i] == 0) q.push(i);
while (q.size())
{
int t = q.front(); q.pop();
for (int i = h[t]; i != -1; i = ne[i])
{
int j = e[i];
if (dist[j] != 0) continue;
dist[j] = dist[t] + 1;
q.push(j);
}
}
return dist[m];
}
int main()
{
cin >> n >> m;
memset(h, -1, sizeof h);
for (int i = 1; i <= n; i ++ )
{
int a, b;
cin >> a >> b;
add(i, a); add(i, b);
}
cout << bfs() << endl;
return 0;
}
题目:
给定一个 N 行 M 列的 01 矩阵 A,A[i][j] 与 A[k][l] 之间的曼哈顿距离定义为:
dist(A[i][j],A[k][l])=|i−k|+|j−l|
输出一个 N 行 M 列的整数矩阵 B,其中:
B[i][j]=min1≤x≤N,1≤y≤M,A[x][y]=1dist(A[i][j],A[x][y])
输入格式
第一行两个整数 N,M。
接下来一个 N 行 M 列的 01矩阵,数字之间没有空格。
输出格式
一个 N 行 M 列的矩阵 B,相邻两个整数之间用一个空格隔开。
数据范围
1≤N,M≤1000
输入样例:
3 4
0001
0011
0110
输出样例:
3 2 1 0
2 1 0 0
1 0 0 1
代码:
#include<cstring>
#include<iostream>
#include<algorithm>
#include<queue>
using namespace std;
const int N = 1010;
#define x first
#define y second
typedef pair<int, int> PII;
int n, m;
char g[N][N];
queue<PII> q;
int dist[N][N];
void bfs()
{
int dx[] = {-1, 0, 1, 0}, dy[] = {0, 1, 0, -1};
memset(dist, -1, sizeof dist);
for(int i = 1; i <= n;i ++)
{
for(int j = 1; j <= m; j ++)
{
if(g[i][j] == '1')
{
dist[i][j] = 0;
q.push({i, j});
}
}
}
while(q.size())
{
auto t = q.front();
q.pop();
for(int i = 0; i < 4; i ++)
{
int a = t.x + dx[i], b = t.y + dy[i];
if(dist[a][b] != -1) continue;
if(a <= 0 || a > n || b <= 0 || b > m) continue;
dist[a][b] = dist[t.x][t.y] + 1;
q.push({a, b});
}
}
}
int main()
{
cin >> n >> m;
for(int i = 1; i <= n; i ++) scanf("%s", g[i] + 1);
bfs();
for(int i = 1; i <= n; i ++)
{
for(int j = 1; j <= m; j ++) printf("%d ", dist[i][j]);
puts("");
}
return 0;
}
1、用字符输入更快一点吧
2、使用偏移量代表四个方向,初始化距离
3、判断入队的条件,如果字符为1,那么该点的距离为0,而且入队
4、如果该点被使用过了或者出界了,那么跳过
5、跳的点的距离等于上一个点的距离再加一
明白的小伙伴麻烦点个赞吧