BFS解决多源最短路相关leetcode算法题
2023-12-25 14:33:47
1.01矩阵
class Solution {
int dx[4] = {0,0,1,-1};
int dy[4] = {1,-1,0,0};
public:
vector<vector<int>> updateMatrix(vector<vector<int>>& mat) {
//正难则反,找0到1的最短距离
int m = mat.size(),n = mat[0].size();
queue<pair<int,int>> q;
//通过此数组对应位置的值既可以标识某个位置是否已访问过,也可在此基础上往外扩展
vector<vector<int>> dist(m,vector<int>(n,-1));
//if(dist[][] == -1) 表示此位置没被访问过
//if(dist[][] != -1) 表示此位置被访问过
for(int i=0;i<m;i++)
{
for(int j=0;j<n;j++)
{
if(mat[i][j] == 0)
{
dist[i][j] = 0;
q.push({i,j});
}
}
}
while(q.size())
{
auto [a,b] = q.front();q.pop();
for(int i=0;i<4;i++)
{
int x = a+dx[i], y =b+dy[i];
if(x>=0 && x<m && y>=0 && y<n && mat[x][y]&& dist[x][y]==-1)
{
dist[x][y] = dist[a][b]+1;
q.push({x,y});
}
}
}
return dist;
}
};
2.飞地的数量
class Solution {
int dx[4] = {0,0,1,-1};
int dy[4] = {1,-1,0,0};
public:
int numEnclaves(vector<vector<int>>& grid) {
int m = grid.size(),n = grid[0].size();
vector<vector<bool>> vis(m,vector<bool>(n));
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)
{
if(grid[i][j] == 1)
{
q.push({i,j});
vis[i][j] = true;
}
}
}
}
//多源BFS
while(q.size())
{
auto [a,b] = q.front();
q.pop();
for(int k=0;k<4;k++)
{
int x = a+dx[k],y = b+dy[k];
if(x>=0&&x<m&&y>=0&&y<n&&grid[x][y]==1&& !vis[x][y])
{
q.push({x,y});
vis[x][y] = true;
}
}
}
//遍历统计
int ret = 0;
for(int i=0;i<m;i++)
{
for(int j=0;j<n;j++)
{
if(grid[i][j]==1 && !vis[i][j]) ret++;
}
}
return ret;
}
};
3.地图中的最高点
class Solution {
int dx[4] = {0,0,1,-1};
int dy[4] = {1,-1,0,0};
public:
vector<vector<int>> highestPeak(vector<vector<int>>& isWater) {
int m = isWater.size(), n=isWater[0].size();
queue<pair<int,int>> q;
vector<vector<int>> dist(m,vector<int>(n,-1));
for(int i=0;i<m;i++)
{
for(int j=0;j<n;j++)
{
if(isWater[i][j])
{
q.push({i,j});
dist[i][j]=0;
}
}
}
//多源BFS
while(q.size())
{
auto [a,b] = q.front();q.pop();
for(int k=0;k<4;k++)
{
int x = a+dx[k],y=b+dy[k];
if(x>=0&&x<m&&y>=0&&y<n&&dist[x][y] == -1)
{
dist[x][y] = dist[a][b]+1;
q.push({x,y});
}
}
}
return dist;
}
};
4.地图分析
class Solution {
int dx[4] = {0,0,1,-1};
int dy[4] = {1,-1,0,0};
public:
int maxDistance(vector<vector<int>>& grid) {
//正难则反
int m=grid.size(),n=grid[0].size();
vector<vector<int>> dist(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(grid[i][j])
{
dist[i][j] =0;
q.push({i,j});
}
}
}
//多源BFS
int ret = -1;
while(q.size())
{
auto[a,b] = q.front();q.pop();
for(int k=0;k<4;k++)
{
int x = a+dx[k],y=b+dy[k];
if(x>=0&& x<m && y>=0 && y<n && dist[x][y] == -1)
{
dist[x][y] = dist[a][b]+1;
q.push({x,y});
ret = max(ret,dist[x][y]);
}
}
}
return ret;
}
};
文章来源:https://blog.csdn.net/m0_55283616/article/details/135195647
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!