C++多源BFS(Multiple Source BFS)是一种基于广度优先搜索的算法,用于在一个图中找到多个起点到达同一个目标点的最短路径。
具体实现步骤如下:
1.初始化:将所有起点的坐标加入队列,并将它们的距离设为0。
2.进行BFS:从队列中取出一个起点,遍历其周围的点,若该点未被访问过,则将其加入队列中,并更新它的距离为当前起点的距离+1。
3.终止条件:当队列为空时,搜索结束。
4.返回结果:返回目标点的距离。
- #include
- #include
- #include
- 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
- #include
- #include
- #include
-
- 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
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、跳的点的距离等于上一个点的距离再加一
明白的小伙伴麻烦点个赞吧