关于多源BFS,基本上就是单源BFS的简单升级了一下,比如在queue中队头开始时只有一个,我们通过这一个队头去推导其他的东西。而多源最短路就是队头一开始有1-n个可能的数,一个一个去BFS。
题目思路:
这个题就直接把所有的1统计出来放进queue中,每次取出对头进行BFS即可,其中有两个问题:
1.我们BFS如何去找到他是0点,怎么通过0传递到下一个0。
2.如何保证他是最小值,会不会出现值覆盖的现象。
其实第一个问题我们可以直接用dist数组进行标记,一旦有0被靠近的1标记了,那么他自身我们就可以看作是个1,通过这个1我们再去找到下一个0。
第二个问题,不会出现覆盖,因为我们每次赋值之后dist就会变成附近1的dist值加1,dist!=-1(我们初始默认0的dist数组值为-1),我们每次都是取最近的,所以一旦到这个地方,其他的点就无法访问了,一旦访问便是最近距离。
千万别忘了判断数组是否越界,否则会导致段错误
#include<bits/stdc++.h>
using namespace std;
char g[1010][1010];
int n,m;
int dist[1010][1010];
typedef pair<int,int> PII;
int dx[4]={1,0,-1,0};
int dy[4]={0,-1,0,1};
void bfs()
{memset(dist,-1,sizeof(dist));queue<PII> q;for(int i=1;i<=n;i++){for(int j=1;j<=m;j++){if(g[i][j]=='1'){q.push({i,j});dist[i][j]=0;}}}while(q.size()){auto t=q.front();q.pop();for(int i=0;i<4;i++){int x=t.first+dx[i];int y=t.second+dy[i];if(x<1||x>n||y<1||y>m)continue;if(dist[x][y]!=-1){continue;}else{dist[x][y]=dist[t.first][t.second]+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>>g[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;
}