首页 > 其他分享 >多源BFS解决最短路问题

多源BFS解决最短路问题

时间:2024-09-06 10:51:43浏览次数:12  
标签:int 短路 矩阵 BFS vector && 多源

目录

01矩阵

飞地的数量

地图中的最高点

地图分析


01矩阵

题目

思路

解决这道题使用的方法是多源BFS,多源BFS区别于单源BFS的地方在于起点不是一个多个,首先将矩阵中所有的0加入队列中,创建一个和原始矩阵大小相同的矩阵dists,矩阵dists中的值为每个点距离0的最短距离,然后进行宽度优先遍历,将没有遍历过的点添加到队列中,并更新该点到0的最短距离,最后返回dists矩阵就可以了。

代码

class Solution {
public:
    vector<vector<int>> updateMatrix(vector<vector<int>>& mat) {
        int m=mat.size(),n=mat[0].size();
        vector<vector<int>> dists(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(mat[i][j]==0){
                    q.push({i,j});
                    dists[i][j]=0;
                }
            }
        int dx[4]={1,-1,0,0};
        int dy[4]={0,0,1,-1};
        while(!q.empty()){
            int sz=q.size();
            while(sz--){
                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 && dists[x][y]==-1){
                        q.push({x,y});
                        dists[x][y]=dists[a][b]+1;
                    }
                }
            }
        }
        return dists;
    }
};
飞地的数量

题目

思路

解决这道题使用的方法是多源BFS,多源BFS区别于单源BFS的地方在于起点不是一个多个。

我们可能想到遍历二维矩阵中的每一个点,对该点进行DFS或者BFS,但是这样的话有点麻烦,我们不妨采用“正难则反”的思想,将二维矩阵中四周值为1的点加入队列中,然后进行宽度优先遍历,将没有访问过的且值为1的点加入队列中。

最后,遍历二维矩阵中所有的点,如果该位置值为1且没有被访问过,那么这个位置就是一个飞地,统计所有的飞地的数量,返回即可。

代码

class Solution {
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++){
            if(grid[i][0]==1) q.push({i,0}),vis[i][0]=true;
            if(grid[i][n-1]==1) q.push({i,n-1}),vis[i][n-1]=true;;
        }
        for(int i=0;i<n;i++){
            if(grid[0][i]==1) q.push({0,i}),vis[0][i]=true;;
            if(grid[m-1][i]==1) q.push({m-1,i}),vis[m-1][i]=true;;
        }
        int dx[4]={1,-1,0,0};
        int dy[4]={0,0,1,-1};
        while(!q.empty()){
            int sz=q.size();
            while(sz--){
                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 && grid[x][y] && !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]==false)
                    ret++;
        return ret;
    }
};
地图中的最高点

题目

思路

解决这道题使用的方法是多源BFS,多源BFS区别于单源BFS的地方在于起点不是一个多个。

首先,我们创建一个和原始矩阵大小相同的二维矩阵heights,然后扫描整个二维矩阵,将所有值为1的点加入队列中,然后进行BFS,将没有访问过的点加入队列中,并更新该位置的高度值,最后,返回二维矩阵heighgts就可以了。

代码

class Solution {
public:
    vector<vector<int>> highestPeak(vector<vector<int>>& isWater) {
        int m=isWater.size(),n=isWater[0].size();
        vector<vector<int>> heights(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(isWater[i][j]==1)
                    q.push({i,j}),heights[i][j]=0;
        int dx[4]={1,-1,0,0};
        int dy[4]={0,0,1,-1};
        while(!q.empty()){
            int sz=q.size();
            while(sz--){
                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 && isWater[x][y]==0 && heights[x][y]==-1)
                        q.push({x,y}),heights[x][y]=heights[a][b]+1;
                }
            }
        }
        return heights;
    }
};
地图分析

题目

思路

解决这道题使用的方法是多源BFS,多源BFS区别于单源BFS的地方在于起点不是一个多个。

我们可能会想到对矩阵中所有值为0的点进行BFS,找出所有距离陆地的距离中的最大距离,但是这样有点麻烦,我们不妨对矩阵中所有值为1的点进行BFS,如果队列的大小为n*n或者为0,说明只存在陆地或者只存在海洋,返回-1即可;否则,创建一个和原始矩阵大小相同的二维矩阵dists,然后将没有访问过的点添加到队列中,并更新该位置到陆地的距离,最后返回dists矩阵中的最大值即可。

代码

class Solution {
public:
    int maxDistance(vector<vector<int>>& grid) {
        int n=grid.size();
        vector<vector<int>> dists(n,vector<int>(n,-1));
        queue<pair<int,int>> q;
        for(int i=0;i<n;i++)
            for(int j=0;j<n;j++)
                if(grid[i][j]==1)
                    q.push({i,j}),dists[i][j]=0;
        if(q.size()==n*n || q.size()==0)
            return -1;
        int dx[4]={1,-1,0,0};
        int dy[4]={0,0,1,-1};
        while(!q.empty()){
            int sz=q.size();
            while(sz--){
                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<n && y>=0 && y<n && dists[x][y]==-1)
                        q.push({x,y}),dists[x][y]=dists[a][b]+1;
                }
            }
        }
        int ret=0;
        for(int i=0;i<n;i++)
            for(int j=0;j<n;j++)
                ret=max(ret,dists[i][j]);
        return ret;
    }
};

标签:int,短路,矩阵,BFS,vector,&&,多源
From: https://blog.csdn.net/wmh_1234567/article/details/140576244

相关文章

  • 有向图最短路径与BFS算法的研究
    有向图最短路径与BFS算法的研究引言有向图G=(V,E)的定义与例子BFS算法及其局限性特定边集E'的构造确认最短路径实现BFS并验证结果(C代码)引言在图论中,寻找最短路径是一个经典问题。广度优先搜索(BFS)是一种在无权重图(即所有边的权重相同)中找到从源节点到所有其他......
  • 有向图的最短路径与BFS算法的局限性分析
    有向图的最短路径与BFS算法的局限性分析引言有向图G=(V,E)的示例图G的邻接表表示问题描述BFS算法回顾BFS在示例图G中的应用及局限性构造E_s并证明BFS的局限性C语言实现及验证分析C语言实现的BFS算法结论引言在图论中,最短路径问题是寻找从一个结点(源结点)到......
  • [Python图论]在用图nx.shortest_path求解最短路径时,节点之间有多条边edge,会如何处理?
    问:在使用图求最短路径时,如果节点之间有多条路径,shortest_route=nx.shortest_path(G,source=start_node,target=end_node,weight='length')会如何处理,会自动选择最短那条吗?#输出图G各节点之间有多少条边edge,并给出其长度Edgesbetween103928and25508583:共2条Edge......
  • 图的广度优先搜索(BFS)算法与邻接矩阵表示
    图的广度优先搜索(BFS)算法与邻接矩阵表示1.图的表示2.广度优先搜索(BFS)BFS算法步骤:3.使用邻接矩阵的BFS实现4.运行时间分析时间复杂度:空间复杂度:5.BFS使用邻接列表与邻接矩阵的比较BFS在邻接列表上的运行时间:6.结论在计算机科学中,图......
  • 求从一固定点到其余点的最短路算法及其matlab程序详解
    #################本文为学习《图论算法及其MATLAB实现》的学习笔记#################算法用途从一固定点到其他所有点的最短路的求法算法思想利用求任意两点间最短路的程序,即可求出从固定点到其他所有点的最短路,从而得到所有的最短路和最短距离。若想查看每条通路所包......
  • 对最长路(和最短路)的一些思考
    为了使得整篇文章显得更加人性化,咱们首先说一下最短路。声明:不是讲解知识点不是讲解知识点不是讲解知识点不是讲解知识点不是讲解知识点,整篇文章建立在默认已经会的基础之上,然后提出一些个人见解。最短路此时的SPFA显得不再重要了(,咱们进入正题,说一下dijkstra。(堆优化的)迪杰......
  • [Python办公]一文入门图论Graphs,轻松处理最短路径等问题!
            [Python办公]一文入门图论Graphs,轻松处理最短路径等问题!        图论是研究图这种数学结构的性质和应用的学科。图(Graphs)由节点(或顶点)和连接这些节点的边组成,它是一种强大的数据结构,广泛应用于各种领域。以下举例用最短距离来入门图论。入门问题: ......
  • AcWing854. Floyd求最短路
    注意:Floyd是求图里面任意两个点x,y之间的最短距离#include<cstring>#include<iostream>#include<algorithm>usingnamespacestd;constintN=210,INF=1e9;intn,m,Q;intd[N][N];voidfloyd(){//枚举1~k个中间节点,尝试通过这几个点中转来达到更短......
  • 分享丨【题单】链表、二叉树与一般树(前后指针/快慢指针/DFS/BFS/直径/LCA)
    作者:灵茶山艾府链接:https://leetcode.cn/circle/discuss/K0n2gO/一、链表注:由于周赛中的链表题可以转成数组处理,难度比直接处理链表低,故不标明难度分。带着问题去做下面的题目:在什么情况下,要用到哨兵节点(dummynode)?在什么情况下,循环条件要写while(node!=null)?什么情况......
  • 求两点间最短路的Dijkstra算法及其matlab程序详解
    #################本文为学习《图论算法及其MATLAB实现》的学习笔记#################设源点为u0u_{0}u0​,目标......