一、多源BFS简介
超级源点:其实就是把相应的原点一次性都丢到队列中
二、01矩阵
class Solution {
public:
int dx[4]={1,-1,0,0};
int dy[4]={0,0,1,-1};
vector<vector<int>> updateMatrix(vector<vector<int>>& nums) {
int m=nums.size(),n=nums[0].size();
vector<vector<int>> ret(m,vector<int>(n,-1));//-1表示没搜索过
queue<pair<int,int>> q;
for(int i=0;i<m;++i)
for(int j=0;j<n;++j)
if(nums[i][j]==0){
q.emplace(i,j);
ret[i][j]=0;
}
//不需要标记数组 不需要step 也不需要控制一层一层出sz
//因为dis数组不仅可以标记哪些地方没有搜索过或者搜索过,而且存储了最短距离
while(!q.empty()){
auto[a,b]=q.front();
q.pop();
for(int k=0;k<4;++k){
int x=dx[k]+a,y=dy[k]+b;
if(x>=0&&x<m&&y>=0&&y<n&&ret[x][y]==-1){
ret[x][y]=ret[a][b]+1;
q.emplace(x,y);
}
}
}
return ret;
}
};
三、飞地的数量
class Solution {
public:
int dx[4]={1,-1,0,0};
int dy[4]={0,0,1,-1};
int numEnclaves(vector<vector<int>>& nums) {
int m=nums.size(),n=nums[0].size();
queue<pair<int,int>> q;
for(int i=0;i<m;++i)
for(int j=0;j<n;++j)
if((i==0||i==m-1||j==0||j==n-1)&&nums[i][j]==1){
q.emplace(i,j);
nums[i][j]=2;//直接在原数组上修改,省去了标记数组
}
while(!q.empty()){
auto[a,b]=q.front();
q.pop();
for(int k=0;k<4;++k){
int x=dx[k]+a,y=dy[k]+b;
if(x>=0&&x<m&&y>=0&&y<n&&nums[x][y]==1){
q.emplace(x,y);
nums[x][y]=2;
}
}
}
int ret=0;
for(int i=0;i<m;++i)
for(int j=0;j<n;++j)
if(nums[i][j]==1) ++ret;
return ret;
}
};
四、地球中的最高点
class Solution {
public:
int dx[4]={1,-1,0,0};
int dy[4]={0,0,1,-1};
vector<vector<int>> highestPeak(vector<vector<int>>& nums) {
int m=nums.size(),n=nums[0].size();
vector<vector<int>> ret(m,vector<int>(n,-1));
queue<pair<int,int>> q;
for(int i=0;i<m;++i)
for(int j=0;j<n;++j)
if(nums[i][j]){
q.emplace(i,j);
ret[i][j]=0;
}
while(!q.empty()){
auto[a,b]=q.front();
q.pop();
for(int k=0;k<4;++k){
int x=dx[k]+a,y=dy[k]+b;
if(x>=0&&x<m&&y>=0&&y<n&&ret[x][y]==-1){
ret[x][y]=ret[a][b]+1;
q.emplace(x,y);
}
}
}
return ret;
}
};
五、地图分析
class Solution {
public:
int dx[4]={1,-1,0,0};
int dy[4]={0,0,1,-1};
int maxDistance(vector<vector<int>>& nums) {
int m=nums.size(),n=nums[0].size();
vector<vector<int>> vv(m,vector<int>(n,-1));
queue<pair<int,int>> q;
for(int i=0;i<m;++i)
for(int j=0;j<n;++j)
if(nums[i][j]){
q.emplace(i,j);
vv[i][j]=0;
}
int ret=-1;//只有陆地或者只有海洋的情况
while(!q.empty()){
auto[a,b]=q.front();
q.pop();
for(int k=0;k<4;++k){
int x=dx[k]+a,y=dy[k]+b;
if(x>=0&&x<m&&y>=0&&y<n&&vv[x][y]==-1){
vv[x][y]=vv[a][b]+1;
q.emplace(x,y);
ret=max(ret,vv[x][y]);
}
}
}
return ret;
}
};