[Algorithm][多源BFS][矩阵][飞地的数量][地图中的最高点][地图分析] + 多源BFS原理讲解 详细讲解

目录

  • 0.原理讲解
  • 1.矩阵
    • 1.题目链接
    • 2.算法原理详解
    • 3.代码实现
  • 2.飞地的数量
    • 1.题目链接
    • 2.算法原理详解
    • 3.代码实现
  • 3.地图中的最高点
    • 1.题目链接
    • 2.算法原理详解
    • 3.代码实现
  • 4.地图分析
    • 1.题目链接
    • 2.算法原理详解
    • 3.代码实现


0.原理讲解

  • 注意:只要是用**BFS解决的最短路径问题,都要求边权为一(边权值相同)**

  • 单源最短路径

    • 把起点加入到队列中
    • 一层一层的往外扩展
  • 多源BFS:用BFS解决边权为一多源最短路径问题
    请添加图片描述

  • 法一:暴力解,把多源最短路径问题转化为若干个单源最短路问题

    • 效率低,大概率会超时
  • 法二:把所有的源点当成一个"超级源点"

    • 此时问题就变成了「单源最短路径」问题
      请添加图片描述
  • "超级源点"的正确性?感性理解

    • 同时从几个源点出发,会存在"舍弃"几个"不好的点"的现象
    • 远的源点走一步肯定没有近的源点走一步好,所以相当于舍去了远的源点
  • 多源BFS如何代码实现?

    • 所有的源点加入到队列里面
    • 一层一层的往外扩展
      请添加图片描述

1.矩阵

1.题目链接

  • 矩阵

2.算法原理详解

  • 思路一:一个位置一个位置求

    • 不用想,这么暴力肯定超时:P
  • 思路二多源BFS + 正难则反 -> 把所有的0当成起点,1当成终点

    • 把所有的0位置加入到队列中
    • 一层一层的向外拓展即可
      请添加图片描述
  • 为什么正着做会很困难呢?

    • 正着做虽然能找到0,但是想把距离存下来,会很难
    • 并且也无法知道是哪个1到了0,距离是多少
  • 为什么本题用到了多源BFS呢?

    • 0是有很多个的,怎么才能保证遇到的1距离这⼀个0是最近的?
    • 先把所有的0都放在队列中,把它们当成⼀个整体,每次把当前队列⾥⾯的所有元素向外扩展⼀次
  • 细节:在单源最短路径中需要:bool visit[i][j]stepsz,而在多源BFS中,只需要一个int dist[i][j]就可以替代这三者的功能

    • 为什么可以替代bool visit[i][j]
      • dist[][]初始化为-1-1表示没有搜索过
      • dist[i][j] != -1则为最短距离
    • <为什么可以替代step
      • (a, b) -> (x, y)dist[a][b]存储了dist[x][y]上一步的距离
        • dist[x][y] = dist[a][b] + 1
    • 为什么可以替代sz
      • 因为不强制一定要按层一层一层出队列,可以一个元素一个元素的往外扩展
      • 不需要知道此时是哪一层,dist[i][j]已经标记了现在是属于哪一层

3.代码实现

vector<vector<int>> UpdateMatrix(vector<vector<int>>& mat) 
{int n = mat.size(), m = mat[0].size();// dist[i][j] == -1 未搜索过// dist[i][j] != -1 最短距离vector<vector<int>> dist(n, vector<int>(m, -1));queue<pair<int, int>> q;// 将所有源点加入到队列中for(int i = 0; i < n; i++){for(int j = 0; j < m; j++){if(mat[i][j] == 0){q.push({i, j});dist[i][j] = 0;}}}// 多源BFSwhile(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 < n && y >= 0 && y < m && dist[x][y] == -1){dist[x][y] = dist[a][b] + 1;q.push({x, y});}}}return dist;
}

2.飞地的数量

1.题目链接

  • 飞地的数量

2.算法原理详解

  • 思路一:一个一个去判断
    • 不用想,这么暴力肯定超时:P
  • 思路二多源BFS + 正难则反 -> 从边界上的1开始,做一次搜索
    • 多源BFS结束后,重新遍历一次数组,最后剩下来的就都是飞地
      请添加图片描述

3.代码实现

int NumEnclaves(vector<vector<int>>& grid) 
{int n = grid.size(), m = grid[0].size();vector<vector<bool>> visit(n, vector<bool>(m, false));queue<pair<int, int>> q;// 将所有边界1入队列for(int i = 0; i < n; i++){if(grid[i][0] == 1){q.push({i, 0});visit[i][0] = true;}if(grid[i][m - 1] == 1){q.push({i, m - 1});visit[i][m - 1] = true;}}for(int i = 0; i < m; i++){if(grid[0][i] == 1){q.push({0, i});visit[0][i] = true;}if(grid[n - 1][i] == 1){q.push({n - 1, i});visit[n - 1][i] = true;}}// 多源BFSwhile(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 < n && y >= 0 && y < m \&& grid[x][y] == 1 && !visit[x][y]){visit[x][y] = true;q.push({x, y});}}}// 遍历计数int count = 0;for(int i = 0; i < n; i++){for(int j = 0; j < m; j++){if(grid[i][j] == 1 && !visit[i][j]){count++;}}}return count;
}

3.地图中的最高点

1.题目链接

  • 地图中的最高点

2.算法原理详解

  • "01矩阵"变形题,直接多源BFS即可

3.代码实现

class Solution 
{int dx[4] = {1, -1, 0, 0};int dy[4] = {0, 0, 1, -1};
public:vector<vector<int>> highestPeak(vector<vector<int>>& isWater) {int n = isWater.size(), m = isWater[0].size();vector<vector<int>> dist(n, vector<int>(m, -1));queue<pair<int, int>> q;// 将边界水域入队列for(int i = 0; i < n; i++){for(int j = 0; j < m; j++){if(isWater[i][j]){dist[i][j] = 0;q.push({i, j});}}}// 多源BFSwhile(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 < n && y >= 0 && y < m && dist[x][y] == -1){dist[x][y] = dist[a][b] + 1;q.push({x, y});}}}return dist;}
};

4.地图分析

1.题目链接

  • 地图分析

2.算法原理详解

  • "01矩阵"变形题,直接多源BFS即可

3.代码实现

class Solution 
{int dx[4] = {1, -1, 0, 0};int dy[4] = {0, 0, 1, -1};
public:int maxDistance(vector<vector<int>>& grid) {int n = grid.size();vector<vector<int>> dist(n, vector(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]){dist[i][j] = 0;q.push({i, j});}}}// 多源BFSint ret = -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 < n && 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;}
};

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

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

相关文章

Apache SeaTunnel在世界级银行巨头JP Morgan 内部的应用实践

作者系 JP Morgan 大数据工程师&#xff0c;文章内容来源于[DET 网络研讨会] 与 Apache SeaTunnel 的数据集成&#xff1a;https://www.youtube.com/watch?vln4mn6vLenc&#xff08;有兴趣的同学可以观看演讲&#xff09; 文章介绍了他任职期间使用 Apache SeaTunnel 优化数据…

基础模型的工具学习:综述

23年6月清华、人大、UIUC、纽约大学、北邮和CMU等的论文“Tool Learning with Foundation Models”。 人类拥有创造和利用工具的非凡能力&#xff0c;使他们能够克服物理限制并探索新领域。随着最近强大的基础模型的出现&#xff0c;人工智能系统有可能像人类一样熟练地使用工…

实践指南:如何将 SpringBoot 项目无缝部署到 Tomcat 服务器

序言 SpringBoot 是一个用来简化 Spring 应用初始搭建以及开发过程的框架&#xff0c;我们可以通过内置的 Tomcat 容器来轻松地运行我们的应用。但在生产环境中&#xff0c;我们可能需要将应用部署到独立的 Tomcat 服务器上。本文给大家介绍 SpringBoot 项目部署到独立 Tomcat…

三:哈希map day6 哈希表理论基础 ● 242.有效的字母异位词 ● 349. 两个数组的交集 ● 202. 快乐数● 1. 两数之和

今日任务 ● 哈希表理论基础 ● 242.有效的字母异位词 ● 349. 两个数组的交集 ● 202. 快乐数 ● 1. 两数之和 今日任务 242.有效的字母异位词 题目 大型概括&#xff1a;map 的使用 1.题目描述-->思路&#xff1a; 给出两个string s,t; …

Android Update Engine 分析(二十九)如何进行连续多个版本的升级?

本文为洛奇看世界(guyongqiangx)原创,转载请注明出处。 原文链接:https://blog.csdn.net/guyongqiangx/article/details/138849767 0. 背景 关于如何连续进行多个版本升级,这是一个很常见的需求,也是 OTA 讨论群里试不试就会讨论的一个话题。 例如,昨天一个小伙伴在群里…

a-auto-complete 请求后端数据做模糊查询,解决下拉框选择选不上,不回显的问题

a-auto-complete 请求后端数据做模糊查询&#xff0c;解决下拉框选择选不上&#xff0c;不回显的问题 记录一个a-auto-complete卡bug卡了两天&#xff0c;找不到哪里的问题下拉框选择选不上&#xff0c;不回显&#xff0c;最后终于解决了。 我还对下拉框显示的内容做了小调整。…

越来越真的Deepfake再次引起网安界的关注

当地时间5月6日&#xff0c;全球网络安全领域最受关注的年度盛会 RSAC 2024在美国旧金山隆重开幕。当天&#xff0c;被誉为“安全圈奥斯卡”的创新沙盒大赛也决出了冠军&#xff0c;Reality Defender凭借其创新性的深度伪造&#xff08;Deepfake&#xff09;检测平台摘得桂冠&a…

【漏洞复现】泛微OA E-Cology users.data信息泄露漏洞

漏洞描述&#xff1a; 泛微OA E-Cology是一款面向中大型组织的数字化办公产品&#xff0c;它基于全新的设计理念和管理思想&#xff0c;旨在为中大型组织创建一个全新的高效协同办公环境。泛微OA E-Cology users.data存在敏感信息泄露漏洞&#xff0c;攻击者利用此漏洞可以获取…

Excel 根据包含的关键词将指定列按关键词指定顺序排列

例题描述和简单分析 有 Excel 文件&#xff0c;数据如下所示&#xff1a; AB1Parent ColumnModifier (Column)2Jack lives in the villageRose3As mentioned by jackVillage4Rose already spoke to jack about last nightJack5Rose left the village6rose was their yesterda…

DigitalOcean 应用托管更新:应用端到端运行时性能大幅改进

DigitalOcean 希望可以为企业提供所需的工具和基础设施&#xff0c;以帮助企业客户加速云端的开发&#xff0c;实现业务的指数级增长。为此 DigitalOcean 在 2020 年就推出了App Platform。 App Platform&#xff08;应用托管&#xff09; 是一个完全托管的 PaaS 解决方案&…

ubuntu下使用docker安装kafka

1.先安装zookeeper docker run -d --restartalways -e ALLOW_ANONYMOUS_LOGINyes --log-driver json-file --log-opt max-size100m --log-opt max-file2 --name zookeeper -p 2181:2181 -v /etc/localtime:/etc/localtime bitnami/zookeeper:latest 2.安装kafka docker run…

Docker 的 Ubuntu 操作系统镜像

Debian 和 Ubuntu 都是目前较为流行的 Debian 系列 的服务器操作系统&#xff0c;十分适合研发场景。 Debian 和 Ubuntu 属于同一系列的发行版。Debian 是由 Ian Murdock 在 1993 年创建的最初的发行版。Ubuntu 是 Mark Shuttleworth 在 2004 年基于 Debian 创建的发行版。 Li…

2024 National Invitational of CCPC (Zhengzhou)(CCPC郑州邀请赛暨CCPC河南省赛)

2024 National Invitational of CCPC (Zhengzhou) 2024CCPC郑州邀请赛暨CCPC河南省赛 2024 National Invitational of CCPC (Zhengzhou) B. 扫雷 1 题意&#xff1a;扫n轮雷&#xff0c;每轮开始获得一枚扫雷币&#xff0c;可保存&#xff0c;从第一轮开始&#xff0c;可以…

STM32 CANFD 基础知识留档

讲得比较细的文章但可能有问题自行判定 附1 附2 前言 CAN2.0 协议中数据段波特率和仲裁段波特率默认是一致&#xff0c;因此只需要关注传输波特率即可 CANFD 协议是向下兼容 CAN2.0 的数据通讯&#xff0c;因此实际使用中需要配置 STM32H7 系列支持的标准是 Compliant with …

大语言模型中上下文长度扩展技术的内容、原因和方式-综述

24年1月阿联酋科技创新研究院、孟加拉国伊斯兰科技大学、斯坦福大学、亚马逊公司和南卡大学AI研究院的论文“The What, Why, and How of Context Length Extension Techniques in Large Language Models – A Detailed Survey“。 LLM通常面临上下文长度外推方面的限制。 理解…

C++11 线程池:轻量级高并发解决方案

C11 线程池&#xff1a;轻量级高并发解决方案 线程池&#xff08;Thread Pool&#xff09;是一种线程管理的机制&#xff0c;它包含了多个预先创建的线程&#xff0c;用于执行多个任务&#xff0c;这些任务被放入任务队列中等待执行。 满足我们的生产者和消费者模型。 线程…

一文带你快速了解GPT-4o!内含免费使用指南!

一、GPT-4o简介 北京时间5月14日&#xff0c;OpenAI举行春季发布会。OpenAI在活动中发布了新旗舰模型“GPT-4o”&#xff01;据OpenAI首席技术官穆里穆拉蒂&#xff08;Muri Murati&#xff09;介绍&#xff0c;GPT-4o在继承GPT-4强大智能的同时&#xff0c;进一步提升了文本、…

电力场景设备漏油检测数据集VOC+YOLO格式338张1类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;338 标注数量(xml文件个数)&#xff1a;338 标注数量(txt文件个数)&#xff1a;338 标注类别…

Qt---项目的创建及运行

一、创建第一个Qt程序 1. 点击创建项目后&#xff0c;选择项目路径以及给项目起名称 名称&#xff1a;不能有中文、不能有空格 路径&#xff1a;不能有中文路径 2. 默认创建有窗口类myWidget&#xff0c;基类有三种选择&#xff1a;QWidget、QMainWindow、QDialog 3. m…

#自学习# 记一次py脚本打开浏览器页面

在项目总结中&#xff0c;遇到系统后台利用浏览器拉起一个已知路径页面的需求&#xff0c;趁着机会整理下。实现起来比较简单&#xff0c;浏览器默认谷歌。 一、技术原理 Selenium&#xff1a;Selenium 是一个用于自动化 Web 浏览器的工具&#xff0c;可模拟用户在浏览器中的各…