脚起水泡是什么原因| 黄色裤子配什么上衣| 甜蜜素是什么| lodge是什么意思| 高压低压是什么意思| 老年人腿肿是什么原因引起的| 骞读什么字| 秦时明月什么时候更新| 灰指甲有什么危害| 银屑病吃什么食物最好| 雪蛤是什么| 宿便是什么意思| 焦虑症看什么科| 呕吐发烧吃什么药| 调剂生是什么意思| 腮边长痘是什么原因| 女生额头长痘痘是什么原因| feno是什么检查| 新生儿感冒是什么症状| 人中发红是什么原因| 打新股需要什么条件| 吃辣椒有什么好处| 维c不能和什么一起吃| 肺结核吃什么好| 有偿服务是什么意思| 为什么医院不开金刚藤| 画蛇添足是什么意思| 乳头胀痛什么原因| 穿模是什么意思| 什么的小学生| 鼠妇是什么动物| h是什么牌子的皮带| 木加号读什么| 蚯蚓是什么动物| 2022年是什么生肖| 含羞草长什么样| 胃酸是什么原因| 顺风顺水是什么生肖| 甲状腺亢进是什么意思| 发票抬头是什么| 特需号是什么意思| 学生近视配什么镜片好| 什么是强迫症有哪些表现| 睡不醒是什么原因| 阿昔洛韦片是什么药| 2.5什么星座| 八月份什么星座| 张嘴睡觉是什么原因| 孕妇梦见很多蛇是什么意思| 违反禁令标志指示什么意思| 砚是什么东西| 什么是前鼻音和后鼻音| hpv66阳性是什么意思| 真菌阴性是什么意思| 半夜口干舌燥是什么原因| 例假血发黑是什么原因| 汉尼拔什么意思| 眼睛痛是什么原因| 贝壳吃什么| 美眉是什么意思| 佛手柑是什么| 什么是无期徒刑| 52岁属什么| 眼睛一直眨是什么原因| 嘴唇发黑什么原因| 间作套种是什么意思| 脸上出汗多是什么原因| 辟谷是什么意思| 神隐是什么意思| 臆想症是什么| 补钙多了有什么坏处| 保守治疗是什么意思| 湿气重吃什么水果| 补气血喝什么口服液好| 18k金是什么意思| 中段尿是什么意思| 急性痛风吃什么药| 脸上反复长痘是什么原因| 梦见河水是什么意思| 时柱亡神是什么意思| 右眼皮跳是什么预兆| 四肢肌力5级什么意思| 耳朵后面是什么穴位| 蜂蜜水什么时候喝好| 咖啡渣子有什么用途| 拍肺部片子挂什么科| afp是什么意思| 婕妤是什么意思| 有主见是什么意思| 惊弓之鸟是什么故事| 暮春是什么时候| 股票的量比是什么意思| 孕晚期流鼻血是什么原因| 鸽子和什么一起炖汤最有营养| 盆腔少量积液是什么意思| 鸡眼和疣有什么区别| 男生下面疼是什么原因| 玛丽珍鞋是什么意思| 肝囊肿是什么病| 羊肉水饺配什么菜好吃| 2009年是什么年| 白浆是什么| 什么思而行| 每晚做梦是什么原因| 安字属于五行属什么| 两个人背靠背是什么牌子| t1是什么意思| pB什么意思| 为什么睡觉后鱼刺没了| 卵巢增大是什么原因引起的| 其实不然是什么意思| 什么原因导致卵巢早衰| 什么是骨科| 为什么要长征| 多米诺骨牌是什么意思| 天网是什么意思| 热火朝天是什么意思| 浑水摸鱼是什么意思| 孩提是什么意思| 清风明月什么意思| 虎跟什么生肖相冲| 耳石症吃什么药最好| 甲壳虫吃什么食物| 牙龈老是出血是什么原因引起的| 肺炎衣原体阳性是什么意思| 什么叫混合斑块| 心脏房颤吃什么药最好| 斜杠青年什么意思| 闭经是什么意思| 申时是什么生肖| 15天来一次月经是什么原因| 宣发是什么意思| 红薯开花预示着什么| 择日什么意思| 肝功能检查什么| 颈椎压迫神经手麻吃什么药| 补刀什么意思| 喉癌是什么原因引起的| 放线菌是什么| 少田宅痣是什么意思| 知柏地黄丸治什么病| 甘是什么意思| 什么时候可以领退休金| 什么是大运| 眼睛干涩用什么眼药水好| 烤冷面的面皮是什么面| 什么叫情绪| 玉什么样的好| 天体是什么意思| 撬墙角是什么意思| 舌头白色是什么原因| 欧巴桑什么意思| met是什么意思| 什么的口水| 经常眩晕是什么原因| 脑供血不足是什么原因引起的| 鳊鱼是什么鱼| 双子男喜欢什么样的女生| 前列腺b超能检查出什么| 紫米和黑米有什么区别| 8月23号是什么星座| 秋天可以干什么| 投诉与举报有什么区别| 义诊是什么意思| 肺气肿是什么症状| 验光pd是什么意思| 双飞是什么生肖| 穿刺是什么意思| NT是检查什么的| 为什么会一直拉肚子| 解辣喝什么| 眼睛长眼屎是什么原因| 像狐狸的狗是什么狗| 无赖不还钱最怕什么| 地主之谊是什么意思| 春天有什么动物| 骨质疏松是什么意思| 做一半就软了是什么原因| 吃地屈孕酮片有什么副作用| 婴儿什么时候可以吃盐| 无精打采是什么生肖| ph值低是什么原因| 不劳而获是什么生肖| 康膜的功效是什么| 月寸读什么| 风湿看什么科室| 甘油三酯偏高是什么意思| 心口窝疼是什么原因| 茄子和什么相克| polo villae是什么档次| 腐竹是什么做的| 尿酸520属于什么水平| 衍生物是什么意思| 炒菜什么时候放盐最合适| 送行是什么意思| 我国四大发明是什么| 一什么宝石| eb病毒是什么| 黄疸偏高有什么危害| 什么样的天山| 为什么一紧张就想拉屎| 一什么春笋| 智齿什么时候开始长| 前列腺按摩什么感觉| 为什么一坐车就想睡觉| 什么凌乱| 碳酸钠是什么| 西瓜什么样的好吃| 几成是什么意思| 唇色深的人适合什么颜色的口红| 11月份什么星座| 纣王姓什么| 最近爆发什么病毒感染| 一个鸟一个衣是什么字| 什么是低钾血症| 喝酒对身体有什么影响| 什么伐桂| rdw是什么意思| 糖尿病能吃什么| 劲旅是什么意思| 什么榴莲最好吃| 01年属什么| 吃坏肚子吃什么药| cool什么意思中文| 蛇蛋是什么样子的| 子宫肌瘤不能吃什么| bbr是什么牌子| 为什么叫老鸨| 素颜霜是干什么用的| 上官是什么意思| 一帘幽梦是什么意思| 梦见牙齿掉光了是什么征兆| 本命年为什么不能结婚| 减肥为什么让早上空腹喝咖啡| 十二生肖本领强是什么生肖| 兰桂坊是什么地方| 世界上最坚硬的东西是什么| 月经推迟不来吃什么药| 金字旁的字有什么| 满日是什么意思| 猫什么时候绝育| 左脚麻是什么原因| 荨麻疹用什么药| 量程是什么| 补液盐是什么| 一生一世是什么生肖| jio什么意思| 大姨夫是什么| 为什么有的人皮肤黑| 权志龙为什么叫gd| 吃什么除体内湿气最快| 经期适合喝什么汤| 凿壁偷光形容什么| 骨髓水肿吃什么消炎药| 指甲有竖纹是什么原因| 什么是膳食纤维| 什么叫微创手术| 含羞草长什么样| 凤毛麟角是什么意思| 愿力是什么意思| 牛蛋是什么| 马克笔什么牌子好| 内分泌紊乱是什么症状| 政法委是干什么的| 百度
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >深度解析之算法之多源BFS

花莲强震大陆网友吁募捐助台渡难关 台媒:感受到浓浓的爱

作者头像
Undoom
发布于 2025-08-06 08:42:43
发布于 2025-08-06 08:42:43
百度 (作者系国家社科基金青年项目“新世纪外国通俗文学汉译研究”负责人、西安外国语大学教授) 7300
代码可运行
举报
文章被收录于专栏:学习学习
运行总次数:0
代码可运行

多源BFS:用BFS解决边权为1的多源最短路问题 解法一:暴力,将多源最短路问题转换为若干个单源最短路问题,但是肯定是会出现超时现象的 解法二:把所有的源点当成一个超级源点,问题就变成了单体的单源最短路问题了

87.矩阵

题目链接 给定一个由 01 组成的矩阵 mat ,请输出一个大小相同的矩阵,其中每一个格子是 mat 中对应位置元素到最近的 0 的距离。

两个相邻元素间的距离为 1

示例 1:

输入: mat = [[0,0,0],[0,1,0],[0,0,0] ] 输出:[[0,0,0],[0,1,0],[0,0,0] ]

示例 2:

输入: mat = [[0,0,0],[0,1,0],[1,1,1] ] 输出:[[0,0,0],[0,1,0],[1,2,1] ]

提示:

  • m == mat.length
  • n == mat[i].length
  • 1 <= m, n <= 104
  • 1 <= m * n <= 104
  • mat[i][j] is either 0 or 1.
  • mat 中至少有一个 0

就是返回一个数组,数组的内容就是当前这个点到附近最近0的距离

image.png
image.png

将所有的0当成起点,1当成终点 1.把所有的0位置加入到队列中 2,。一层一层的向外拓展即可

代码语言:javascript
代码运行次数:0
运行
复制
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)

    {

        int m=mat.size(),n=mat[0].size();

        //dist[i][j]==-1的话没救说明这个数是没有被搜索过的

        //dist[i][j]!=-1 表示的是最短距离

        vector<vector<int>>dist(m,vector<int>(n,-1));//初始化为-1

  

        queue<pair<int,int>>q;

  

        //1.将所有的源点加入到队列中去,这里源点是0

        for(int i=0;i<m;i++)

        {

            for(int j=0;j<n;j++)

            {

                if(mat[i][j]==0)//说明我们的这个0是源点,那么我们加入到队列中去

                {

                    q.push({i,j});

                    dist[i][j]=0;//标记下我们当前的坐标是否遍历过

                }

            }

        }

  

        //2.一层一层的往外扩

        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 &&dist[x][y]==-1)//没有被搜索过的坐标

                {

                    dist[x][y]=dist[a][b]+1;//我们这里直接+1就行了,因为我们的dist[a][b]存的即是最短距离

                    q.push({x,y});

                }

            }

        }

  

        return dist;

    }

};

88.飞地的数量

题目链接 给你一个大小为 m x n 的二进制矩阵 grid ,其中 0 表示一个海洋单元格、1 表示一个陆地单元格。

一次 移动 是指从一个陆地单元格走到另一个相邻(上、下、左、右)的陆地单元格或跨过 grid 的边界。

返回网格中 无法 在任意次数的移动中离开网格边界的陆地单元格的数量。

示例 1:

输入: grid = [[0,0,0,0],[1,0,1,0],[0,1,1,0],[0,0,0,0] ] 输出: 3 **解释:**有三个 1 被 0 包围。一个 1 没有被包围,因为它在边界上。

示例 2:

输入: grid = [[0,1,1,0],[0,0,1,0],[0,0,1,0],[0,0,0,0] ] 输出: 0 解释: 所有 1 都在边界上或可以到达边界。

提示:

  • m == grid.length
  • n == grid[i].length
  • 1 <= m, n <= 500
  • grid[i][j] 的值为 01

我们直接正难则反 先找到边界的1,然后一层一层的向内走

代码语言:javascript
代码运行次数:0
运行
复制
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));//vis这个数组是来检查这个坐标是否被遍历过

        queue<pair<int,int>>q;

  

        //将四周的1加入到队列中去

        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)//说明我们找到了边界上的1,那么我们将这个1加进队列中去

                    q.push({i,j});

                    vis[i][j]=true;

                }

            }

        }

  

        //多源bfs,向内进行扩展操作

        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&&vis[x][y]==false&&grid[x][y]==1)//这个位置的值必须是1,并且是没有遍历过的

                {

                    vis[x][y]=true;//将这个位置状态进行标记一下

                    q.push({x,y});//将这个位置插入到队列中去

                }

            }

        }

  

        //统计结果

        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)//这个位置是1,并且这个位置没有被标记过状态的话,说明就是我们想要的那种位置

                {

                    ret++;

                }

            }

        }

        return ret;

    }

};

先利用两个for循环将四周的1加入到我们的队列中去

然后把利用多源bfs向内进行拓展操作

最后我们利用两层循环将我们的整个区域进行遍历一遍,然后如果这个位置是没有被标记过状态的话,并且这个位置的值的大小是1的话,那么我们就将这个算进去,ret++

89.地图中的最高点

题目链接 给你一个大小为 m x n 的整数矩阵 isWater ,它代表了一个由 陆地水域 单元格组成的地图。

  • 如果 isWater[i][j] == 0 ,格子 (i, j) 是一个 陆地 格子。
  • 如果 isWater[i][j] == 1 ,格子 (i, j) 是一个 水域 格子。

你需要按照如下规则给每个单元格安排高度:

  • 每个格子的高度都必须是非负的。
  • 如果一个格子是 水域 ,那么它的高度必须为 0
  • 任意相邻的格子高度差 至多1 。当两个格子在正东、南、西、北方向上相互紧挨着,就称它们为相邻的格子。(也就是说它们有一条公共边)

找到一种安排高度的方案,使得矩阵中的最高高度值 最大

请你返回一个大小为 m x n 的整数矩阵 height ,其中 height[i][j] 是格子 (i, j) 的高度。如果有多种解法,请返回 任意一个

示例 1:

输入: isWater = [[0,1],[0,0] ] 输出: [[1,0],[2,1] ] 解释: 上图展示了给各个格子安排的高度。 蓝色格子是水域格,绿色格子是陆地格。

示例 2:

输入: isWater = [[0,0,1],[1,0,0],[0,0,0] ] 输出: [[1,1,0],[0,1,1],[1,2,2] ] **解释:**所有安排方案中,最高可行高度为 2 。 任意安排方案中,只要最高高度为 2 且符合上述规则的,都为可行方案。

提示:

  • m == isWater.length
  • n == isWater[i].length
  • 1 <= m, n <= 1000
  • isWater[i][j] 要么是 0 ,要么是 1
  • 至少有 1 个水域格子。

注意: 本题与 542 题相同。

我们将0周围的拓展成1,再将1周围的拓展成2

代码语言:javascript
代码运行次数:0
运行
复制
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();

        vector<vector<int>>dist(m,vector<int>(n,-1));//将里面的元素都初始化为-1,如果这个位置的值是-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)//说明这个位置是水域

                {

                    dist[i][j]=0;//那么我们将这个区域标记为0

                    q.push({i,j});//将这个位置加入到(i,j)中去

                }

            }

        }

  

        //2.多源bfs

        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&&dist[x][y]==-1)//这个位置是没有搜索过的

                {

                    dist[x][y]=dist[a][b]+1;//这个大小直接在上一层的坐标的基础上加上一

                    q.push({x,y});//将当前的坐标放进队列中去

                }

  

            }

        }

  

        return dist;

    }

};

90.地图分析

题目链接你现在手里有一份大小为 n x n 的 网格 grid,上面的每个 单元格 都用 01 标记好了。其中 0 代表海洋,1 代表陆地。

请你找出一个海洋单元格,这个海洋单元格到离它最近的陆地单元格的距离是最大的,并返回该距离。如果网格上只有陆地或者海洋,请返回 -1

我们这里说的距离是「曼哈顿距离」( Manhattan Distance):(x0, y0)(x1, y1) 这两个单元格之间的距离是 |x0 - x1| + |y0 - y1|

示例 1:

输入: grid = [[1,0,1],[0,0,0],[1,0,1] ] 输出: 2 解释: 海洋单元格 (1, 1) 和所有陆地单元格之间的距离都达到最大,最大距离为 2。

示例 2:

输入: grid = [[1,0,0],[0,0,0],[0,0,0] ] 输出: 4 解释: 海洋单元格 (2, 2) 和所有陆地单元格之间的距离都达到最大,最大距离为 4。

提示:

  • n == grid.length
  • n == grid[i].length
  • 1 <= n <= 100
  • grid[i][j] 不是 0 就是 1
代码语言:javascript
代码运行次数:0
运行
复制
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));//里面的值是-1的话,就说明这个数我们还没有搜索过

  

        queue<pair<int,int>>q;

  

        //将所有的源点加进去

        for(int i=0;i<m;i++)

        {

            for(int j=0;j<n;j++)

            {

                if(grid[i][j]==1)

                {

                    dist[i][j]=0;//标记下这个位置的状态

                    q.push({i,j});//将坐标插入到队列中去

                }

            }

        }

  

        int ret=-1;//统计最终的结果,一开始初始化为-1,因为如果找不到的话,那么就返回-1

        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&&dist[x][y]==-1)//说明这个位置是没有遍历过的

                {

                    dist[x][y]=dist[a][b]+1;

                    q.push({x,y});

                    ret=max(ret,dist[x][y]);

                }

            }

        }

        return ret;

  

    }

};
本文参与?腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2025-08-06,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客?前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与?腾讯云自媒体同步曝光计划? ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 87.矩阵
  • 88.飞地的数量
  • 89.地图中的最高点
  • 90.地图分析
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
看花灯是什么节日 肝内胆管轻度扩张是什么意思 代孕是什么意思 拔掉智齿有什么影响 莲藕不能和什么一起吃
pr是什么缩写 转氨酶高是什么问题 吃什么容易导致流产 擦枪走火什么意思 芦荟胶有什么作用
明天什么日子 o和b型生的孩子是什么血型 两点水有什么字 hpv16阳性有什么症状 安居乐业什么意思
梦见老人死了又活了是什么意思 麒麟长什么样 怀孕后期脚肿是什么原因 右手小拇指发麻是什么原因 茯苓的功效与作用是什么
身份证号码代表什么hcv8jop2ns2r.cn 梦见一条大蟒蛇是什么征兆hcv9jop4ns6r.cn 什么东西蛋白质含量高hcv8jop6ns3r.cn 阴道骚痒是什么原因xinjiangjialails.com 减肥早餐吃什么最好hcv9jop8ns2r.cn
吃什么解毒最快hcv8jop2ns2r.cn pv值是什么意思hcv8jop6ns5r.cn 农田种什么最赚钱hcv8jop0ns5r.cn 1965年属什么hcv8jop9ns5r.cn 乳腺靶向检查是什么hcv9jop5ns1r.cn
2021年什么年hcv8jop0ns7r.cn 青定读什么hcv9jop6ns7r.cn 七月属什么生肖hcv9jop6ns1r.cn 什么水果对皮肤好祛痘clwhiglsz.com 人肉搜索是什么意思hcv9jop0ns7r.cn
沙眼是什么原因引起的cj623037.com 卅什么意思hcv8jop7ns4r.cn 绿茶不能和什么一起吃hcv9jop8ns0r.cn 海蓝之谜适合什么肤质onlinewuye.com 美国的国球是什么hcv8jop2ns6r.cn
百度