多源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 que;
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;

}

posted on 2025-03-27 20:38  下头小美  阅读(51)  评论(0)    收藏  举报