【C++刷题】优选算法——BFS第三辑

news2024/11/24 9:54:28

多源BFS问题解决:用 BFS 解决边权为1的多源最短路问题
解法一:把多源最短路问题转化为若干个单源最短路问题
解法二:把所有的源点当成一个“超级源点”,从而转化为单源最短路问题(推荐)
单源最短路问题的解法:把起点加入到队列中,一层一层向外扩展
多源最短路问题的解法:把所有的起点加入到队列中,一层一层向外扩展

  1. 01 矩阵
    在这里插入图片描述
class Solution {
int m, n;
vector<vector<int>> distance;
queue<pair<int, int>> q;
unordered_multimap<int, int> direction = {
    {0, 1},
    {0, -1},
    {1, 0},
    {-1, 0},
};
public:
    void bfs() {
        while (!q.empty()) {
            auto front = q.front();
            q.pop();
            for (auto& e : direction) {
                int x = front.first + e.first, y = front.second + e.second;
                if (x >= 0 && x < m
                && y >= 0 && y < n
                && distance[x][y] == -1) {
                    distance[x][y] = distance[front.first][front.second] + 1;
                    q.push({x, y});
                }
            }
        }
    }
    vector<vector<int>> updateMatrix(vector<vector<int>>& mat) {
        m = mat.size(), n = mat[0].size();
        distance = vector<vector<int>>(m, vector<int>(n, -1));
        for (int i = 0; i < m; ++i) {
            for (int j = 0; j < n; ++j) {
                if (mat[i][j] == 0) {
                    distance[i][j] = 0;
                    q.push({i, j});
                }
            }
        }
        bfs();
        return distance;
    }
};
  1. 飞地的数量
    在这里插入图片描述
class Solution {
int m, n;
vector<vector<bool>> mark;
queue<pair<int, int>> q;
unordered_multimap<int, int> direction = {
    {0, 1},
    {0, -1},
    {1, 0},
    {-1, 0},
};
public:
    void bfs(vector<vector<int>>& grid) {
        while (!q.empty()) {
            auto front = q.front();
            q.pop();
            for (auto& e : direction) {
                int x = front.first + e.first, y = front.second + e.second;
                if (x >= 0 && x < m
                && y >= 0 && y < n
                && !mark[x][y]
                && grid[x][y] == 1) {
                    mark[x][y] = true;
                    q.push({x, y});
                }
            }
        }
    }
    int numEnclaves(vector<vector<int>>& grid) {
        m = grid.size(), n = grid[0].size();
        mark = vector<vector<bool>>(m, vector<bool>(n, false));

        // grid[i][0] 和 grid[i][n-1]
        for (int i = 0; i < m; ++i) {
            if (grid[i][0] == 1 && !mark[i][0]) {
                mark[i][0] = true;
                q.push({i, 0});
            }
            if (grid[i][n-1] == 1 && !mark[i][n-1]) {
                mark[i][n-1] = true;
                q.push({i, n-1});
            }
        }

        // grid[0][j] 和 grid[m-1][j]
        for (int j = 0; j < n; ++j) {
            if (grid[0][j] == 1 && !mark[0][j]) {
                mark[0][j] = true;
                q.push({0, j});
            }
            if (grid[m-1][j] == 1 && !mark[m-1][j]) {
                mark[m-1][j] = true;
                q.push({m-1, j});
            }
        }

        bfs(grid);

        int ret = 0;
        for (int i = 0; i < m; ++i) {
            for (int j = 0; j < n; ++j) {
                if (grid[i][j] == 1 && !mark[i][j]) {
                    ++ret;
                }
            }
        }
        return ret;
    }
};
  1. 地图中的最高点
    在这里插入图片描述
class Solution {
    int m, n;
    vector<vector<int>> height;
    queue<pair<int, int>> q;
    unordered_multimap<int, int> direction = {
        {0, 1},
        {0, -1},
        {1, 0},
        {-1, 0},
    };
public:
    void bfs() {
        while (!q.empty()) {
            auto front = q.front();
            q.pop();
            for (auto& e : direction) {
                int x = front.first + e.first, y = front.second + e.second;
                if (x >= 0 && x < m
                && y >= 0 && y < n
                && height[x][y] == -1) {
                    height[x][y] = height[front.first][front.second] + 1;
                    q.push({x, y});
                }
            }
        }
    }
    vector<vector<int>> highestPeak(vector<vector<int>>& isWater) {
        m = isWater.size(), n = isWater[0].size();
        height = vector<vector<int>>(m, vector<int>(n, -1));
        for (int i = 0; i < m; ++i) {
            for (int j = 0; j < n; ++j) {
                if (isWater[i][j]) {
                    height[i][j] = 0;
                    q.push({i, j});
                }
            }
        }

        bfs();
        return height;
    }
};
  1. 地图分析
    在这里插入图片描述
class Solution {
    int m, n;
    vector<vector<int>> distance;
    queue<pair<int, int>> q;
    unordered_multimap<int, int> direction = {
        {0, 1},
        {0, -1},
        {1, 0},
        {-1, 0},
    };
    int ret = 0;
public:
    void bfs() {
        while (!q.empty()) {
            auto front = q.front();
            q.pop();
            for (auto& e : direction) {
                int x = front.first + e.first, y = front.second + e.second;
                if (x >= 0 && x < m
                && y >= 0 && y < n
                && distance[x][y] == -1) {
                    distance[x][y] = distance[front.first][front.second] + 1;
                    q.push({x, y});
                    ret = max(ret, distance[x][y]);
                }
            }
        }
    }
    int maxDistance(vector<vector<int>>& grid) {
        m = grid.size(), n = grid[0].size();
        distance = vector<vector<int>>(m, vector<int>(n, -1));

        for (int i = 0; i < m; ++i) {
            for (int j = 0; j < n; ++j) {
                if (grid[i][j] == 1) {
                    distance[i][j] = 0;
                    q.push({i, j});
                }
            }
        }

        if (q.empty() || q.size() == m * n) return -1;
        bfs();

        return ret;
    }
};

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

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

相关文章

Linux进程--进程查询和创建

目录 一、前言二、进程查询三、进程创建1.创建操作2.返回值疑云 一、前言 本篇文章的探讨是基于一定的进程理解的&#xff0c;在此基础上对有关进程的操作进行讲解。 二、进程查询 首先我们来认识一下进程查询的指令 ps ajx |head -1&& ps ajx |grep process |grep…

B1.5 EL0视角下的软件控制功能

快速链接: . 👉👉👉 ARMv8/ARMv9架构入门到精通-[目录] 👈👈👈 付费专栏-付费课程 【购买须知】个人博客笔记导读目录(全部) B1.5 EL0视角下的软件控制功能 以下章节描述了软件控制功能的EL0视图: 异常处理 等待中断和等待事件

Dubbo源码深度解析(二)

接着《Dubbo源码深度解析(一)》继续讲&#xff0c;上篇博客主要讲Dubbo提供的三个注解的作用&#xff0c;即&#xff1a;EnableDubbo、DubboComponentScan、EnableDubboConfig。其中后两个注解是在EnableDubbo上的&#xff0c;因此在启动类上加上EnableDubbo注解&#xff0c;等…

Java并发—volatile关键字的作用及使用场景

在这篇文章Java并发—Java内存模型以及线程安全-CSDN博客多次提及volatile关键字&#xff0c;这是一个非常重要的概念&#xff0c;主要用于多线程编程中&#xff0c;它确保了变量的可见性和禁止指令重排序&#xff0c;但不保证原子性&#xff0c;下面详细解释volatile关键字的作…

使用SpringAOP实现公共字段填充

文章目录 概要整体架构流程技术细节小结 概要 在新增员工或者新增菜品分类时需要设置创建时间、创建人、修改时间、修改人等字段&#xff0c;在编辑员工或者编辑菜品分类时需要设置修改时间、修改人等字段。这些字段属于公共字段&#xff0c;也就是也就是在我们的系统中很多表…

Flux:Midjourney的新图像模型挑战者

--->更多内容&#xff0c;请移步“鲁班秘笈”&#xff01;&#xff01;<--- Black Forest Labs是一家由前Stability.ai开发人员创立的AI初创公司&#xff0c;旨在为图像和视频创建尖端的生成式 AI 模型。这家初创公司声称&#xff0c;其第一个模型系列Flux.1为文本到图像…

【FAQ】为啥MultipartFile 的InputStream available会为0

背景 在Spring boot 文件上传案例中可能会存在获取MultipartFile InputStream.available()方法为0的情况&#xff0c;导致在文件上传到Minio后对象大小为0的情况 问题原因 在介绍问题原因前我们先探究下MultipartFile 是怎么实现的 这里只是剖析InputStream&#xff0c;所以…

Linux驱动入门实验班day03-另一种注册cdev的方式

问题&#xff1a;原来的函数/*major register_chrdev(0, "100ask_hello", &hello_drv);*/会将主设备号major对应的所有次设备号&#xff0c;对应的设备节点&#xff0c;总是访问到驱动程序hello_drv。 这个问题&#xff0c;会导致主设备号不够用。 解决方式&am…

c++ - unordered_set与unordered_map模拟实现

文章目录 前言一、unordered_set模拟实现二、unordered_map模拟实现 前言 1、unordered_set与unordered_map的介绍与接口使用可参考&#xff1a;unordered_set 、 unordered_map。 2、unordered_set和 unordered_map 的底层实现都是基于哈希表的。哈希表是一种通过哈希函数组织…

HarmonyOS(48) 挂载卸载事件 UI组件的添加和删除监听

UI组件的添加和删除监听 一级目录示例代码参考资料 一级目录 我们通过if条件添加组件的时候&#xff0c;是可以通过onAttach、onDetach、onAppear、onDisAppear来监听组件的添加和删除。 示例代码 // xxx.ets// xxx.ets import { promptAction } from kit.ArkUIEntry Compo…

2024华数杯数学建模A题完整论文讲解(含每一问python代码+结果+可视化图)

大家好呀&#xff0c;从发布赛题一直到现在&#xff0c;总算完成了2024 年华数杯全国大学生数学建模竞赛A题机器臂关节角路径的优化设计完整的成品论文。 本论文可以保证原创&#xff0c;保证高质量。绝不是随便引用一大堆模型和代码复制粘贴进来完全没有应用糊弄人的垃圾半成…

VBA信息获取与处理:VBA代码分类及如何利用代码自动关闭空闲文件

《VBA信息获取与处理》教程(版权10178984)是我推出第六套教程&#xff0c;目前已经是第一版修订了。这套教程定位于最高级&#xff0c;是学完初级&#xff0c;中级后的教程。这部教程给大家讲解的内容有&#xff1a;跨应用程序信息获得、随机信息的利用、电子邮件的发送、VBA互…

LC65---2164.对奇偶下标分别排序(排序)--Java版

1.题目 2.思路 &#xff08;1&#xff09;分别提取奇数下标和偶数下标的元素。 &#xff08;2&#xff09;对奇数下标的元素按非递增顺序排序&#xff0c;对偶数下标的元素按非递减顺序排序。 (3)最后将排列好的数字进行合并。 补充&#xff1a; 3.代码实现 class Solution…

PyCharm 2024.1 总结和最新变化

​ 您好&#xff0c;我是程序员小羊&#xff01; 前言 PyCharm 2024.1 是 JetBrains 最新发布的Python集成开发环境&#xff08;IDE&#xff09;&#xff0c;旨在提供更强大的功能和更好的用户体验。以下是对这个版本的总结和最新变化的介绍 智能代码建议和自动完成&#xff1a…

C语言 ——— 学习并使用 strerror 函数

目录 学习strerror函数 使用strerror函数 学习strerror函数 库函数在执行的时候&#xff0c;发生了错误&#xff0c;会将这个错误码存放在errno这个变量中&#xff0c;而errno是C语言提供的一个全局变量 而strerror函数是一个错误报告函数&#xff0c;可以将对应的错误码转…

roomformer-端到端矢量检测模型

论文&#xff1a;Connecting the Dots: Floorplan Reconstruction Using Two-Level Queries 论文地址&#xff1a;https://arxiv.org/pdf/2211.15658 code&#xff1a;https://github.com/ywyue/RoomFormer or https://github.com/woodfrog/poly-diffuse 参考&#xff1a;ht…

指针的指针作为形参实测

1. VS2019里面创建C控制台工程 2. 代码 #include <iostream>uint8_t buf[3][10] { {1,2,3},{4,5,6,7,8},{9,0} }; uint8_t len1 3,len2 5,len3 2;void f1(uint8_t **dstBuf, uint8_t *dstLen) {*dstBuf buf[0];*dstLen len1; }void f2(uint8_t** dstBuf, uint8_t*…

密码学基础-数据加密

密码学基础-对称加密与非对称加密 概述 安全通常从四个方面来定义&#xff1a; 机密性完整性合法性&#xff08;可用性&#xff0c;合法的数据才可用&#xff09;不可否认性&#xff08;发送方不可否认发送过的消息&#xff0c;接收方不可否认接收过的消息&#xff09; 对当…

低代码: 开发难点分析,核心技术架构设计

开发难点分析 1 &#xff09;怎样实现组件 核心问题&#xff1a;编辑器 和 页面其实整个就是一系列元素构成的这些元素的自然应该抽象成组件&#xff0c;这些组件的属性应该怎样设计在不同的项目中怎样做到统一的使用 2 &#xff09;跨项目使用 在不同的项目中怎样做到统一的…

最强开源文生图模型一夜易主!SD一作、Stabililty AI核心成员Robin Rombach下场创业了,一出手就是王炸。

时隔4个月&#xff0c;开源文生图模型霸主Stable Diffusion原班人马再创业&#xff01;2024年8月1日官宣&#xff1a;Black Forest Labs成立&#xff0c;公司的第一个产品FLUX.1系列模型包含专业版、开发者版、快速版三种模型&#xff0c;效果直接秒杀Midjourney、DALL-E和Stab…