BFS:多源BFS问题

news2024/9/24 13:25:57

一、多源BFS简介

 超级源点:其实就是把相应的原点一次性都丢到队列中

二、01矩阵

. - 力扣(LeetCode)

class Solution {
public:
     const int dx[4]={1,-1,0,0};
     const int dy[4]={0,0,1,-1};
    vector<vector<int>> updateMatrix(vector<vector<int>>& mat) {
     //多源BFS  正难则反,以0为起点向外扩展
     int m=mat.size(),n=mat[0].size();
     vector<vector<int>> dis(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(mat[i][j]==0)
         {
            q.emplace(i,j);
            dis[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&&dis[x][y]==-1) 
            {
               dis[x][y]=dis[a][b]+1;
               q.emplace(x,y);
            }
        }
      }
      return dis;
    }
};

三、飞地的数量

. - 力扣(LeetCode)

class Solution {
public:
//正难则反
     const int dx[4]={1,-1,0,0};
     const int dy[4]={0,0,1,-1};
     int numEnclaves(vector<vector<int>>& grid) {
       int m=grid.size(),n=grid[0].size();
       //从边开始进行一次宽搜 将可以走出边界的标记一下
       vector<vector<bool>> vis(m,vector<bool>(n));
       //将边界1的都丢到队列中
       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.emplace(i,j);
                    vis[i][j]=true;
                }
        //进行多源BFS
        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&&grid[x][y]==1&&vis[x][y]==false)
                 {
                    q.emplace(x,y);
                    vis[x][y]=true;
                 }
            }
        }
        //处理完之后,遍历一下找到没有被标记且为1的单元格 就可以统计个数了
        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;
    }
};

四、地球中的最高点

. - 力扣(LeetCode)

class Solution {
public:
     const int dx[4]={1,-1,0,0};
     const int dy[4]={0,0,1,-1};
    vector<vector<int>> highestPeak(vector<vector<int>>& isWater) {
        int m=isWater.size(),n=isWater[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(isWater[i][j]==1)
              {
                q.emplace(i,j);
                vv[i][j]=0;
              }
         //多源BFS
         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);
                  }
            }
         }
         return vv;
    }
};

 五、地图分析

. - 力扣(LeetCode)

class Solution {
public:
     const int dx[4]={1,-1,0,0};
     const int dy[4]={0,0,1,-1};
    int maxDistance(vector<vector<int>>& grid) 
    {
        int m=grid.size(),n=grid[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(grid[i][j]==1)
           {
            q.emplace(i,j);
            vv[i][j]=0;
           }
        //多源BFS
        int ret=-1;//如果只有海洋或者只有陆地,那么就会直接返回-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;
    }
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1920877.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2024最新国际版抖音TikTok安装教程,免root免拔卡安卓+iOS,附全套安装工具!

我是阿星&#xff0c;今天给大家带来是2024年最新TikTok国际版抖音的下载和安装教程&#xff0c;而且还是免root免拔卡的那种&#xff0c;安卓和iOS都能用哦&#xff01;由于某些原因&#xff0c;国内用户并不能使用TikTok。今天阿星就教一下大家怎么安装TikTok。 TikTok在全球…

自动驾驶AVM环视算法--540度全景的算法实现和exe测试demo

参考&#xff1a;金书世界 540度全景影像是什么 540度全景影像是在360度全景影像基础上的升级功能&#xff0c;它增加了更多的摄像头来收集周围的图像数据。通常&#xff0c;这些摄像头分布在车辆的更多位置&#xff0c;例如车顶、车底等&#xff0c;以便更全面地捕捉车辆周围…

【C++题解】1156 - 排除异形基因

问题&#xff1a;1156 - 排除异形基因 类型&#xff1a;数组基础 题目描述&#xff1a; 神舟号飞船在完成宇宙探险任务回到地球后&#xff0c;宇航员张三感觉身体不太舒服&#xff0c;去了医院检查&#xff0c;医生诊断结果&#xff1a;张三体内基因已被改变&#xff0c;原有…

微信小程序---npm 支持

一、构建 npm 目前小程序已经支持使用 npm 安装第三方包&#xff0c;但是这些 npm 包在小程序中不能够直接使用&#xff0c;必须得使用小程序开发者工具进行构建后才可以使用。 为什么得使用小程序开发者工具需要构建呢❓ 因为 node_modules 目录下的包&#xff0c;不会参与…

【建议收藏】一万字图文并茂,终于有人把GPT的玩法整理全了

1. 学生常用 1.1 辅导作业、写作业 打数学建模和写期末作业~ Openai GPT-4o 模型从 2024 年 5 月发布以来&#xff0c;作为各项性能评测综合第一的 GPT。 对于法律类&#xff0c;语言类的作业&#xff0c;随意秒杀了&#xff01;&#xff01; 所以我决定让他做一道高等数学…

【开源项目的机遇与挑战】探索、贡献与应对

&#x1f493; 博客主页&#xff1a;倔强的石头的CSDN主页 &#x1f4dd;Gitee主页&#xff1a;倔强的石头的gitee主页 ⏩ 文章专栏&#xff1a;《热点时事》 期待您的关注 目录 引言 一&#xff1a;开源项目的发展趋势 &#x1f343;开源项目的蓬勃发展现状 &#x1f343;开…

GitHub访问慢的问题彻底解决(一)

1、访问巨慢&#xff0c;图片打不开 按照下面这个项目来解决 https://github.com/521xueweihan/GitHub520 【前提】能够访问github 本项目无需安装任何程序&#xff0c;通过修改本地 hosts 文件&#xff0c;试图解决&#xff1a; GitHub 访问速度慢的问题GitHub 项目中的图…

【STM32标准库】读写内部FLASH

1.内部FLASH的构成 STM32F407的内部FLASH包含主存储器、系统存储器、OTP区域以及选项字节区域。 一般我们说STM32内部FLASH的时候&#xff0c;都是指这个主存储器区域&#xff0c;它是存储用户应用程序的空间。STM32F407ZGT6型号芯片&#xff0c; 它的主存储区域大小为1MB。其…

JavaSE 面向对象程序设计进阶 IO 综合练习 利用糊涂包生成假数据 随机点名器 登录案例

目录 生成假数据 利用糊涂包生成假数据 随机点名器 综合练习 生成假数据 制造假数据 制造假数据也是开发中的一个能力 在各个网上爬取数据 这是其中一个方法 爬取网站中的内容 import cn.hutool.core.io.FileUtil;import java.io.IOException; import java.io.InputSt…

银行函证业务的数字化转型:合合信息智能文档处理平台如何实现集中化处理与全流程合规?

“银行函证”是注册会计师在获取被审计单位授权后&#xff0c;直接向银行业金融机构发出询证函&#xff0c;银行业金融机构针对所收到的询证函&#xff0c;查询、核对相关信息并直接提供书面回函的过程。 财政部、银保监会联合发布《关于加快推进银行函证规范化、集约化、数字…

教程系列2 | 趋动云『社区项目』一步实现与 AI 对话

上周&#xff0c;我们沉浸于文生图【教程系列1 | 趋动云『社区项目』极速部署 SD WebUI】的奇幻世界&#xff0c;领略了文字转化为视觉的无限乐趣。本周我们继续与 AI 进行对话&#xff0c;探索智能交互的无限魅力&#xff01; Llama3-8B-Chinese-Chat Llama3-8B-Chinese-Cha…

system V共享内存【Linux】

文章目录 原理shmgetftokshmat(share memory attach)shmdt&#xff0c;去关联&#xff08;share memory delete attach&#xff09;shmctl ,删除共享内存共享内存与管道 原理 共享内存本质让不同进程看到同一份资源。 申请共享内存&#xff1a; 1、操作系统在物理内存当中申请…

PGCCC|【PostgreSQL】PCA认证考试大纲#postgresql认证

PostgreSQL Certified Associate|PCA&#xff08;初级&#xff09; 学员将学会安装、创建和维护PostgreSQL数据库。学完后&#xff0c;学员可以从事PostgreSQL数据库的数据操作和管理等工作。 获证途径 参加PostgreSQL培训再考试 考试为上机考试。 PostgreSQL PCA培训考试课…

【嵌入式Linux】<知识点> GDB调试(更新中)

文章目录 前言 一、GDB调试预备工作 二、GDB的启动与退出 三、GDB中查看源代码 四、GDB断点操作 五、GDB调试指令 前言 在专栏【嵌入式Linux】应用开发篇_Linux打工仔的博客中&#xff0c;我们已经写了大量的源程序。但是在调试这些程序时我们都是通过printf大法和肉眼除…

网络(一)——初始网络

文章目录 计算机网络的背景网络发展认识 "协议" 网络协议初识协议分层网络分层 网络传输基本流程数据包封装和分用网络中的地址管理认识IP地址认识MAC地址 计算机网络的背景 网络发展 独立模式:计算机之间相互独立 在最早的时候&#xff0c;计算机之间是相互独立的&…

【启明智显分享】乐鑫HMI方案4.3寸触摸串口屏应用于称重测力控制仪表

称重测力控制仪表是将称重传感器信号&#xff08;或再通过重量变送器&#xff09;转换为重量数字显示&#xff0c;并可对重量数据进行传输、储存、统计、打印的电子设备&#xff0c;常用于工农业生产中的自动化配料&#xff0c;称重&#xff0c;以提高生产效率。随着工业化的发…

Oracle11g_RAC for vmware workstation 安装教程(on suse11)

一、前言 本文介绍在vmware workstation环境下&#xff0c;基于suse11sp1操作系统安装Oracle11g RACASM 数据库&#xff08;两节点&#xff09;。 1.1 RAC中的基本概念 安装ORACLE RACASM前&#xff0c;您可能需要事先简要的了解RAC&#xff0c;CRS&#xff0c;ASM的概念。 1.1…

【Linux】01.Linux 的常见指令

1. ls 指令 语法&#xff1a;ls [选项] [目录名或文件名] 功能&#xff1a;对于目录&#xff0c;该命令列出该目录下的所有子目录与文件。对于文件&#xff0c;将列出文件名以及其他信息 常用选项&#xff1a; -a&#xff1a;列出当前目录下的所有文件&#xff0c;包含隐藏文件…

java 实验一:Java集成开发环境的搭建

一、实验目的 1、掌握Java集成开发环境的搭建方式&#xff0c;重点掌握JDK/Eclipse的安装&#xff0c;同时熟悉开发环境的使用&#xff1b; 2、重点掌握JDK/Eclipse的安装&#xff0c;同时熟悉开发环境的使用&#xff1b; 3、会使用输出语句在命令行输出信息&#xff1b; 4…

智能合约和分布式应用管理系统:技术革新与未来展望

引言 随着区块链技术的不断发展&#xff0c;智能合约和分布式应用&#xff08;DApps&#xff09;逐渐成为数字经济中的重要组成部分。智能合约是一种自执行的协议&#xff0c;能够在预设条件满足时自动执行代码&#xff0c;而无需人工干预或中介机构。这种自动化和信任机制极大…