[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://xiahunao.cn/news/3018055.html

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

相关文章

springboot(3.2.5)初步集成MinIO(8.5.9)开发记录

springboot初步集成MinIO开发记录 说明一&#xff1a;引入maven依赖二&#xff1a;手动注入minioClient三&#xff1a;创建service类四&#xff1a;测试打印连接信息五&#xff1a;时区转化工具类六&#xff1a;常用操作演示 说明 这里只是作者开发的记录&#xff0c;已备将来…

论文| Visual place recognition: A survey from deep learning perspective

2021-Visual place recognition: A survey from deep learning perspective

c++笔记——概述运算符重载——解析运算符重载的难点

前言:运算符重载是面向对象的一个重要的知识点。我们都知道内置类型可以进行一般的运算符的运算。但是如果是一个自定义类型&#xff0c; 这些运算符就无法使用了。那么为了解决这个问题&#xff0c; 我们的祖师爷就在c中添加了运算符重载的概念。 本篇主要通过实例的实现来讲述…

Facebook革命:数字社交的全新篇章

随着互联网的不断普及和科技的飞速发展&#xff0c;社交媒体已经成为现代社会不可或缺的一部分。在众多社交媒体平台中&#xff0c;Facebook以其广泛的用户群体和强大的功能而备受瞩目。然而&#xff0c;Facebook并非止步于现状&#xff0c;而是正在掀起一场数字社交的革命&…

Github 2024-05-07 开源项目日报 Tp10

根据Github Trendings的统计,今日(2024-05-07统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量TypeScript项目4Jupyter Notebook项目2Python项目1Batchfile项目1非开发语言项目1Java项目1HTML项目1C#项目1从零开始构建你喜爱的技术 创建周期…

MySQL 高级 - 第七章 | 索引的数据结构

目录 一、为什么使用索引二、什么是索引2.1 索引的概述2.2 索引的优缺点 三、InnoDB 中索引的推演3.1 InnoDB 页简介3.2 没有索引的查找3.3 设计索引3.3.1 一个简单的索引设计方案3.3.2 InnoDB 中索引方案① 迭代 1 次&#xff1a;目录项记录的页② 迭代 2 次&#xff1a;多个目…

Java | Leetcode Java题解之第74题搜索二维矩阵

题目&#xff1a; 题解&#xff1a; class Solution {public boolean searchMatrix(int[][] matrix, int target) {int m matrix.length, n matrix[0].length;int low 0, high m * n - 1;while (low < high) {int mid (high - low) / 2 low;int x matrix[mid / n][m…

ubuntu20部署3d高斯

3d高斯的链接&#xff1a;https://github.com/graphdeco-inria/gaussian-splatting 系统环境 ubuntu20的系统环境&#xff0c;打算只运行训练的代码&#xff0c;而不去进行麻烦的可视化&#xff0c;可视化直接在windows上用他们预编译好的exe去可视化。&#xff08;因为看的很…

TC4056 1A线性锂离子电池充电器芯片IC

一、产品描述 TC4056是一款完整的单节锂离子电池采用恒定电流/恒定电压线性充电器。其底部带有散热片的ESOP8/DIP8封装与较少的外部元件数目使得TC4056成为便携式应用的理想选择。TC4056可以适合USB电源和适配器电源工作。 由于采用了内部PMOS FET架构&#xff0…

基于单片机的无线数据传输系统设计

摘要:基于单片机的无线数据传输系统的设计,实现了温度和湿度的自动采集、无线通讯和报警功能。该系统包括了LCD1602显示电路、DHT11温湿度采集电路等,完成了基于无线数据传输的方法来实现温湿度的采集。 关键词:温湿度检测;N RF 24 L 01;单片机 0 引言 随着科技水平的提高,…

DMAR: [INTR-REMAP] Present field in the IRTE entry is clear 的解决办法

问题描述 在使用FPGA开发PCIe的MSI-X中断相关功能时&#xff0c;一次测试过程中dmesg打印出如下错误&#xff0c;使用cat /proc/interrupts查看FPGA的PCIe驱动程序未收到MSIX中断。使用的系统为基于Intel x86_64的linux&#xff08;RHEL8.9&#xff09;&#xff0c;基于Xilinx …

【边东随笔】北美鳄龟的生存智慧:细心 | 信心 | 狠心 | 耐心

非常谨慎&#xff0c;在水域中会先找到躲避将自身安置于有利地形 ( 细心 &#xff09;。 浮出水面换气&#xff0c;水体稍有异动就会退回水中&#xff0c;优秀掠食者对自身优势牢牢的把握&#xff08; 信心 &#xff09;。 非常优雅&#xff0c;猎食动作不存在任何花里胡哨&a…

解决Node.js mysql客户端不支持认证协议引发的“ER_NOT_SUPPORTED_AUTH_MODE”问题

这是一个版本问题 我用koa2和mysql2链接就没有问题 不知道这个老项目运行为啥有这个问题 解决方案 打开mysql运行这个两个命令&#xff1a; ALTER USER rootlocalhost IDENTIFIED WITH mysql_native_password BY 123321; FLUSH PRIVILEGES; 须知(给小白看的&#xff01;) …

【Pytorch】4.torchvision.datasets的使用

什么是torchvision.datasets、 是pytorch官方给出的关于cv领域的训练数据集&#xff0c;我们可以用官方提供的数据集进行学习与训练 如何查看 我们可以进入Pytorch官网 切换一下版本到v0.9.0&#xff0c;就可以看到官方给出的数据集了 同时也有官方训练好的cv模型可以供我们…

Unity 性能优化之图片优化(八)

提示&#xff1a;仅供参考&#xff0c;有误之处&#xff0c;麻烦大佬指出&#xff0c;不胜感激&#xff01; 文章目录 前言一、可以提前和美术商量的事1.避免内存浪费&#xff08;UI图片&#xff0c;不是贴图&#xff09;2.提升图片性能 二、图片优化1.图片Max Size修改&#x…

2024年全域电商矩阵109节线上课

《24年全域电商矩阵109节线上课》是一门全面介绍电子商务领域的课程。从电子商务的基本概念到全球电子商务趋势&#xff0c;再到电子商务的营销策略和实际操作技巧&#xff0c;本课程涵盖了丰富多样的主题。学员将通过109节在线课程系统全面了解电子商务&#xff0c;并获得在这…

AI换脸免费软件Rope中文汉化蓝宝石版本全新UI界面,修复部分已知错误【附下载地址与详细使用教程】

rope蓝宝石版&#xff1a;点击下载 注意&#xff1a;此版本支持N卡、A卡、CPU&#xff0c;且建议使用中高端显卡&#xff0c;系统要求win10及以上。 Rope-蓝宝石 更新内容&#xff1a; 0214版更新&#xff1a; ①&#xff08;已修复&#xff09;恢复到以前的模型荷载参数。有…

使用 Kubeadm 搭建个公网 k8s 集群(单控制平面集群)

前言 YY&#xff1a;国庆的时候趁着阿里云和腾讯云的轻量级服务器做促销一不小心剁了个手&#x1f60e;&#x1f622;&#xff0c;2 Cores&#xff0c;4G RAM 还是阔以的&#xff0c;既然买了&#xff0c;那不能不用呀&#x1f6a9;&#xff0c;之前一直想着搭建个 k8s 集群玩…

C语言——联合体和枚举

1. 联合体 联合体和结构体类似。 联合体类型的声明&#xff1a; 联合体的特点&#xff1a; 像结构体⼀样&#xff0c;联合体也是由⼀个或者多个成员构成&#xff0c;这些成员可以是不同的类型。 但是编译器只为最⼤的成员分配⾜够的内存空间。联合体的特点是所有成员共⽤同⼀…

UDP通讯的demo

udp通讯的demo&#xff0c;这个只是简单的实现。 后面我还会加入udp组播功能。 因为懒&#xff0c;所以我自己发&#xff0c;自己接收了。 经过测试&#xff0c;可以看到&#xff0c;发送消息和接收消息功能都没问题。 广播&#xff1a; 这个是点对点的通过对方的ip和端口发…