多源bfs
多源 BFS 算法问题:是有多个起始节点(源点),目标是找到从这些多个源点到图中其他各个可达节点的最短路径。例如在一个城市地图中,有多个垃圾回收站(源点),要计算各个小区到最近垃圾回收站的距离,就可能用到多源 BFS。多源 BFS 的核心在于初始化队列时将所有源点都放入队列,之后和单源 BFS 类似,按广度优先顺序访问节点并扩展,直到遍历完所有可达节点。它也主要用于边权为 1 或边权相等的情况 。
解决多源 BFS 问题时,若直接转化为若干个单源最短路问题求解,可能因重复查找过多而超时。更好的方法是把所有源点视为一个 “超级源点” ,将问题转化为单源最短路问题来处理。
eg
给定一个 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]=min
1≤x≤N,1≤y≤M,A[x][y]=1
dist(A[i][j],A[x][y])
输入格式
第一行两个整数 N,M。
接下来一个 N 行 M 列的 01 矩阵,数字之间没有空格。
输出格式
一个 N 行 M 列的矩阵 B,相邻两个整数之间用一个空格隔开。
输入输出样例
输入 #1复制
3 4
0001
0011
0110
输出 #1复制
3 2 1 0
2 1 0 0
1 0 0 1
include<bits/stdc++.h>
using namespace std;
const int N=1100;
int g[N][N];
int n,m;
typedef pair<int,int> pii;
queue
int dis[N][N];
bool st[N][N];
int np[4][2]={
{1,0},{-1,0},{0,1},{0,-1}
};
int main()
{
cin>>n>>m;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
char c;
cin>>c;
g[i][j]=c-'0';
if(g[i][j]==1) que.push({i,j}),st[i][j]=1;
}
}
while(!que.empty())
{
auto f=que.front(); que.pop();
for(int i=0;i<4;i++)
{
int nx=f.first+np[i][0],ny=f.second+np[i][1];
if(nx<1 || nx>n || ny<1 || ny>m || st[nx][ny])continue;
st[nx][ny]=1;
dis[nx][ny]=dis[f.first][f.second]+1;
que.push({nx,ny});
}
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
cout<<dis[i][j]<<" ";
}
cout<<endl;
}
return 0;
}
浙公网安备 33010602011771号