当前位置: 首页 > news >正文

C++:bfs解决多源最短路与拓扑排序问题习题

1. 多源最短路

其实就是将所有源头都加入队列,

01矩阵

LCR 107. 01 矩阵 - 力扣(LeetCode)

 思路

求每个元素到离其最近0的距离如果我们将1当做源头加入队列的话,无法处理多个连续1的距离存储,我们反其道而行之,将所有的终点存进队列,遍历离其最近的1,当然如果旁边是0无需入队(因为旁边这个0找到的1肯定比他快一步),是1才要入队先遍历到1的步数一定是最小的步数

ac代码

class Solution {
public:vector<vector<int>> updateMatrix(vector<vector<int>>& mat) {int m=mat.size();//int n=mat[0].size();vector<vector<int>> states(m,vector<int>(n,-1));int dx[4]={1,0,0,-1};int dy[4]={0,1,-1,0};for(int i=0;i<m;i++){for(int j=0;j<n;j++){if(mat[i][j]==0)//从终点开始找{qu.push({i,j});states[i][j]=0;}}}while(!qu.empty()){int x1=qu.front().first;int y1=qu.front().second;qu.pop();for(int i=0;i<4;i++){int x2=x1+dx[i];int y2=y1+dy[i];if(x2<0||x2>=m||y2<0||y2>=n)continue;if(mat[x2][y2]==0||states[x2][y2]!=-1)//同为0或者走过了先走的肯定更小continue;states[x2][y2]=states[x1][y1]+1;qu.push({x2,y2});}}return states;}private:queue<pair<int,int>> qu;};
 飞地的数量

1020. 飞地的数量 - 力扣(LeetCode)

思路

解法1:

(非多源bfs)遍历地图,将遇到的并且没有走过的1进行bfs,如果没有陆地在边缘返回值为连通的陆地数量,在边缘就返回0,将返回值累加起来即可。

解法2:
(多源bfs)先考虑什么可以当源头,所有的1明显不可以,0进去也得不出来结果。我们发现题目的关键点在于边缘的陆地就不是飞地,所以我们将所有在边缘的陆地入队,然后查找与这些陆地相连的其他陆地将其标记,最后遍历地图查找没被标记的陆地即可。

ac代码

class Solution {
public:int bfs(vector<vector<int>>& grid,int x,int y){int m=grid.size();int n=grid[0].size();int dx[4]={1,0,0,-1};int dy[4]={0,1,-1,0};queue<pair<int,int>> qu;qu.push({x,y});states[x][y]=true;int cnt=1;//记录有多少个陆地bool f=true;//如果有边缘就变falsewhile(!qu.empty()){int x1=qu.front().first;int y1=qu.front().second;qu.pop();for(int i=0;i<4;i++){int x2=x1+dx[i];int y2=y1+dy[i];if(x2<0||x2>=m||y2<0||y2>=n){f=false;//有靠边缘的continue;}if(states[x2][y2]!=false||grid[x2][y2]==0)continue;states[x2][y2]=true;//走过qu.push({x2,y2});cnt++;}}if(f)return cnt;elsereturn 0;}int numEnclaves(vector<vector<int>>& grid) {int m=grid.size();int n=grid[0].size();memset(states,false,sizeof states);int sum=0;for(int i=0;i<m;i++){for(int j=0;j<n;j++){if(grid[i][j]==1&&!states[i][j]){sum+=bfs(grid,i,j);}}}return sum;}private:bool states[510][510];
};
地图分析

1162. 地图分析 - 力扣(LeetCode)

 思路

统计海洋单位与离其最近的陆地的距离,直接将所有陆地视为源头四散记录自己离海洋的距离,即可。每到一个海洋就比较到这个海洋的距离与之前记录的到海洋的距离那个更远。

ac代码

class Solution {
public:int maxDistance(vector<vector<int>>& grid) {int n=grid.size();int dx[4]={1,0,0,-1};int dy[4]={0,-1,1,0};vector<vector<int>> states(n,vector<int>(n,-1));for(int i=0;i<n;i++){for(int j=0;j<n;j++){if(grid[i][j]==1){qu.push({i,j});states[i][j]=0;}}}while(!qu.empty()){int x1=qu.front().first;int y1=qu.front().second;qu.pop();for(int i=0;i<4;i++){int x2=x1+dx[i];int y2=y1+dy[i];if(x2<0||x2>=n||y2<0||y2>=n)continue;if(grid[x2][y2]==1||states[x2][y2]!=-1)//不是陆地,不能走过continue;states[x2][y2]=states[x1][y1]+1;cntmax=max(cntmax,states[x2][y2]);qu.push({x2,y2});}}return cntmax;}private:int cntmax=-1;queue<pair<int,int>> qu;//存陆地};
地图中的最高点

1765. 地图中的最高点 - 力扣(LeetCode)

思路 

题目很直观,将所有的水域入队,然后四处扩散,增加即可。

ac代码

class Solution {
public:vector<vector<int>> highestPeak(vector<vector<int>>& isWater) {int m=isWater.size();//int n=isWater[0].size();vector<vector<int>> states(m,vector<int>(n,-1));int dx[4]={1,0,0,-1};int dy[4]={0,1,-1,0};for(int i=0;i<m;i++){for(int j=0;j<n;j++){if(isWater[i][j]==1)//从水开始{qu.push({i,j});states[i][j]=0;//水域为0}}}while(!qu.empty()){int x1=qu.front().first;int y1=qu.front().second;qu.pop();for(int i=0;i<4;i++){int x2=x1+dx[i];int y2=y1+dy[i];if(x2<0||x2>=m||y2<0||y2>=n)continue;if(isWater[x2][y2]==1||states[x2][y2]!=-1)//都为水域或者走过了先走的肯定更小continue;states[x2][y2]=states[x1][y1]+1;qu.push({x2,y2});}}return states;}private:queue<pair<int,int>> qu;        
};

2. 拓扑排序问题

将问题变成一个有向无环图,解决拓扑排序要找到做事情的先后顺序,结果可能不是唯一的。

如下图

有几个通向自己的节点入度就为几

我们找到图中入度为0的点a,必须将a消除后使b和c的入度也从1变为0才可以消除b和c,必须把b和c都消除后才能将d的入度变为0,再消除b。

实现拓扑排序的具体步骤:

借助队列:queue

1. 初始化:把所有入度为0的点加入到队列中

2. 当队列不为空时:

(1)拿出队头元素加到最终结果上

(2)删除与该元素相连的边

(3)判断删除边相连的点是否入度变为了0,为0就入队

可以创建邻接矩阵来构造图

也可以创建邻接表来构造:vector<vector<int>> 或者 unordered_map<int,vector<int>>

课程表

207. 课程表 - 力扣(LeetCode)

思路

创建一个哈希表来记录每个课程之间的关系将完成x课程的前置课程y1,y2等都存储起来,创建一个数组记录每个课程的入度

ac代码

class Solution {
public:bool canFinish(int numCourses, vector<vector<int>>& prerequisites) {in.resize(numCourses,0);int m=prerequisites.size();for(int i=0;i<m;i++){//数组里只有两个数map[prerequisites[i][1]].push_back(prerequisites[i][0]);//b[i]通向a[i]in[prerequisites[i][0]]++;//a[i]多一个前置条件}for(int i=0;i<in.size();i++){if(in[i]==0)//没前置条件qu.push(i);//将这门课程入队}int cnt=0;while(!qu.empty()){int tmp=qu.front();qu.pop();cnt++;//for(int i=0;i<map[tmp].size();i++)//删除这个前置,其链接的点少一个前置{in[map[tmp][i]]--;if(in[map[tmp][i]]==0)//前置都完成了{qu.push(map[tmp][i]);}}}if(cnt==numCourses)return true;elsereturn false;}private:unordered_map<int,vector<int>> map;//邻接表vector<int> in;//记录每个课程的入度queue<int> qu; 
};
课程表 II

LCR 113. 课程表 II - 力扣(LeetCode)

思路

与上题没什么不同,就是多一个数组来记录可以学习的课程

ac代码

class Solution {
public:vector<int> findOrder(int numCourses, vector<vector<int>>& prerequisites) {in.resize(numCourses,0);int m=prerequisites.size();for(int i=0;i<m;i++){map[prerequisites[i][1]].push_back(prerequisites[i][0]);//将b[i]后置保存起来in[prerequisites[i][0]]++;//这个课程前置加1}for(int i=0;i<in.size();i++){if(in[i]==0)qu.push(i);}vector<int> nums;while(!qu.empty()){int tmp=qu.front();qu.pop();nums.push_back(tmp);for(int i=0;i<map[tmp].size();i++){in[map[tmp][i]]--;if(in[map[tmp][i]]==0)qu.push(map[tmp][i]);}}if(nums.size()==numCourses)return nums;elsenums.resize(0,0);return nums;}unordered_map<int,vector<int>> map;//邻接表vector<int> in;//记录自身有多少前置queue<int> qu;
};
火星词典

LCR 114. 火星词典 - 力扣(LeetCode)

 思路

如何建图?
将第一个字符串与之后所有字符串对比(双指针一个字符一个字符对比)然后再将第二个字符串与第二个字符串之后所有字符串对比依次类推...,有不一样的就检测哈希表中x字符有没有已经存入相同的前置字符,没有再存进去,然后break再往后也找不出来了;要注意当数组走完并且第二个数组比第一个数组小时是错误的,要特判一下

记录入度

用一个哈希表进行记录

for(auto& [a,b]:in)//in中char会存到a里入度的值会存到b里
//用来遍历in数组

解决问题与上方差不多

ac代码

class Solution {
public:string alienOrder(vector<string>& words) {//所有前置走完走接下来的int m = words.size();for (auto& tmp : words)//初始化入度{for (auto t : tmp){in[t] = 0;}}for (int i = 0; i < m - 1; i++){for (int j = i + 1; j < m; j++){int n=min(words[i].size(),words[j].size());string s1=words[i];string s2=words[j];int t=0;for( t=0;t<n;t++){if(s1[t]!=s2[t])//不相等再存{if(!map[s1[t]].count(s2[t]))//看s1[t]其中有没有存s2[t]{map[s1[t]].insert(s2[t]);in[s2[t]]++;}break;//发现不同就不用往后找了}}if(t==s2.size()&&t<s1.size())return "";}}int cnt=0;for(auto& [a,b]:in)//in中char会存到a里入度的值会存到b里{if(b==0) qu.push(a);cnt++;}string s = "";while (!qu.empty()){char tmp = qu.front();qu.pop();s += tmp;for (auto ch : map[tmp])//遍历哈希表{in[ch]--;if (in[ch] == 0)qu.push(ch);}}if(s.size()==cnt)return s;elsereturn "";}unordered_map<char, unordered_set<char>> map;//unordered_map<char, int> in;//记录这个单词还有多少单词queue<char> qu;
};

这篇就到这里了(๑′ᴗ‵๑)I Lᵒᵛᵉᵧₒᵤ❤

相关文章:

C++:bfs解决多源最短路与拓扑排序问题习题

1. 多源最短路 其实就是将所有源头都加入队列&#xff0c; 01矩阵 LCR 107. 01 矩阵 - 力扣&#xff08;LeetCode&#xff09; 思路 求每个元素到离其最近0的距离如果我们将1当做源头加入队列的话&#xff0c;无法处理多个连续1的距离存储&#xff0c;我们反其道而行之&…...

【面试题】JVM部分[2025/1/13 ~ 2025/1/19]

JVM部分[2025/1/13 ~ 2025/1/19] 1. JVM 由哪些部分组成&#xff1f;2. Java 的类加载过程是怎样的&#xff1f;3. 请你介绍下 JVM 内存模型&#xff0c;分为哪些区域&#xff1f;各区域的作用是什么&#xff1f;4. JVM 垃圾回收调优的主要目标是什么&#xff1f;5. 如何对 Jav…...

文献综述相关ChatGPT提示词分享

文献综述 ChatGPT 可以帮助提高文献综述的有效性和全面性。ChatGPT可以高效搜索和审查与宝子们课题研究相关的文献资料来源。一些给力的插件工具还可以帮助您总结复杂的研究论文并提取信息以更快更好地消化信息。合理的运用ChatGPT和GPTs可以提高文献综述的清晰度和质量&#…...

Excel 技巧14 - 如何批量删除表格中的空行(★)

本文讲如何批量删除表格中的空行。 1&#xff0c;如何批量删除表格中的空行 要点就是按下F5&#xff0c;然后选择空值条件以定位所有空行&#xff0c;然后删除即可。 按下F5 点 定位条件 选 空值&#xff0c;点确认 这样就选中了空行 然后点右键&#xff0c;选 删除 选中 下方…...

图片生成Prompt编写技巧

1. 图片情绪&#xff08;场景氛围&#xff09; 一张图片一般都会有一个情绪基调&#xff0c;因为作画本质上也是在传达一些情绪&#xff0c;一般都会借助图片的氛围去转达。例如&#xff1a;比如家庭聚会一般是欢乐、喜乐融融。断壁残垣一般是悲凉。还有萧瑟、孤寂等。 2.补充细…...

【STM32-学习笔记-4-】PWM、输入捕获(PWMI)

文章目录 1、PWMPWM配置 2、输入捕获配置3、编码器 1、PWM PWM配置 配置时基单元配置输出比较单元配置输出PWM波的端口 #include "stm32f10x.h" // Device headervoid PWM_Init(void) { //**配置输出PWM波的端口**********************************…...

TOSUN同星TsMaster使用入门——3、使用系统变量及c小程序结合panel面板发送报文

本篇内容将介绍TsMaster中常用的Panel面板控件以及使用Panel控件通过系统变量以及c小程序来修改信号的值&#xff0c;控制报文的发送等。 目录 一、常用的Panel控件介绍 1.1系统——启动停止按钮 1.2 显示控件——文本框 1.3 显示控件——分组框 1.4 读写控件——按钮 1.…...

【Web】2025-SUCTF个人wp

目录 SU_blog SU_photogallery SU_POP SU_blog 先是注册功能覆盖admin账号 以admin身份登录&#xff0c;拿到读文件的权限 ./article?filearticles/..././..././..././..././..././..././etc/passwd ./article?filearticles/..././..././..././..././..././..././proc/1…...

React进阶之react.js、jsx模板语法及babel编译

React React介绍React官网初识React学习MVCMVVM JSX外部的元素props和内部的状态statepropsstate 生命周期constructorgetDerivedStateFromPropsrendercomponentDidMount()shouldComponentUpdategetSnapshotBeforeUpdate(prevProps, prevState) 创建项目CRA&#xff1a;create-…...

在Linux上如何让ollama在GPU上运行模型

之前一直在 Mac 上使用 ollama 所以没注意&#xff0c;最近在 Ubuntu 上运行发现一直在 CPU 上跑。我一开始以为是超显存了&#xff0c;因为 Mac 上如果超内存的话&#xff0c;那么就只用 CPU&#xff0c;但是我发现 Llama3.2 3B 只占用 3GB&#xff0c;这远没有超。看了一下命…...

R 语言科研绘图第 20 期 --- 箱线图-配对

在发表科研论文的过程中&#xff0c;科研绘图是必不可少的&#xff0c;一张好看的图形会是文章很大的加分项。 为了便于使用&#xff0c;本系列文章介绍的所有绘图都已收录到了 sciRplot 项目中&#xff0c;获取方式&#xff1a; R 语言科研绘图模板 --- sciRplothttps://mp.…...

suctf2025

Suctf2025 --2标识为看的wp&#xff0c;没环境复现了 所有参考资料将在文本末尾标明 WEB SU_photogallery 思路&#x1f447; 构造一个压缩包&#xff0c;解压出我们想解压的部分&#xff0c;然后其他部分是损坏的&#xff0c;这样是不是就可以让整个解压过程是出错的从而…...

Quinlan C4.5剪枝U(0,6)U(1,16)等置信上限如何计算?

之前看到Quinlan中关于C4.5决策树算法剪枝环节中,关于错误率e置信区间估计,为啥 当E=0时,U(0,1)=0.75,U(0,6)=0.206,U(0,9)=0.143? 而当E不为0时,比如U(1,16)=0.157,如图: 关于C4.5决策树,Quinlan写了一本书,如下: J. Ross Quinlan (Auth.) - C4.5. Programs f…...

计算机组成原理--笔记二

目录 一.计算机系统的工作原理 二.计算机的性能指标 1.存储器的性能指标 2.CPU的性能指标 3.系统整体的性能指标&#xff08;静态&#xff09; 4.系统整体的性能指标&#xff08;动态&#xff09; 三.进制计算 1.任意进制 > 十进制 2.二进制 <> 八、十六进制…...

麒麟系统中删除权限不够的文件方法

在麒麟系统中删除权限不够的文件&#xff0c;可以尝试以下几种方法&#xff1a; 通过修改文件权限删除 打开终端&#xff1a;点击左下角的“终端”图标&#xff0c;或者通过搜索功能找到并打开终端 。定位文件&#xff1a;使用cd命令切换到文件所在的目录 。修改文件权限&…...

自定义提示确认弹窗-vue

最初可运行代码 弹窗组件代码&#xff1a; &#xff08;后来发现以下代码可运行&#xff0c;但打包 typescript 类型检查出错&#xff0c;可打包的代码在文末&#xff09; <template><div v-if"isVisible" class"dialog"><div class&quo…...

运行fastGPT 第五步 配置FastGPT和上传知识库 打造AI客服

运行fastGPT 第五步 配置FastGPT和上传知识库 打造AI客服 根据上一步的步骤&#xff0c;已经调试了ONE API的接口&#xff0c;下面&#xff0c;我们就登陆fastGPT吧 http://xxx.xxx.xxx.xxx:3000/ 这个就是你的fastGPT后台地址&#xff0c;可以在configer文件中找到。 账号是…...

CSS 合法颜色值

CSS 颜色 CSS 中的颜色可以通过以下方法指定&#xff1a; 十六进制颜色带透明度的十六进制颜色RGB 颜色RGBA 颜色HSL 颜色HSLA 颜色预定义/跨浏览器的颜色名称使用 currentcolor 关键字 十六进制颜色 用 #RRGGBB 规定十六进制颜色&#xff0c;其中 RR&#xff08;红色&…...

Redis - General - 未授权访问漏洞(用户配置问题)

0x01&#xff1a;产品简介 Redis&#xff08;Remote Dictionary Service&#xff0c;远程数据服务&#xff09;&#xff0c;是一款开源的基于内存的键值对存储系统&#xff0c;其主要被用作高性能缓存服务器使用&#xff08;比如作为消息中间件和用于 Session 共享&#xff09…...

解决 WSL 2 中 Ubuntu 22.04 安装 Docker 后无法启动的问题

问题场景 安装Docker后&#xff0c;执行sudo service docker start启动Docker&#xff0c;提示启动成功 rootDev:~# sudo service docker start * Starting Docker: docker [ OK ]执行su…...

Java-41 深入浅出 Spring - 声明式事务的支持 事务配置 XML模式 XML+注解模式

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; &#x1f680; AI篇持续更新中&#xff01;&#xff08;长期更新&#xff09; 目前2025年06月05日更新到&#xff1a; AI炼丹日志-28 - Aud…...

JVM暂停(Stop-The-World,STW)的原因分类及对应排查方案

JVM暂停(Stop-The-World,STW)的完整原因分类及对应排查方案,结合JVM运行机制和常见故障场景整理而成: 一、GC相关暂停​​ 1. ​​安全点(Safepoint)阻塞​​ ​​现象​​:JVM暂停但无GC日志,日志显示No GCs detected。​​原因​​:JVM等待所有线程进入安全点(如…...

【HarmonyOS 5 开发速记】如何获取用户信息(头像/昵称/手机号)

1.获取 authorizationCode&#xff1a; 2.利用 authorizationCode 获取 accessToken&#xff1a;文档中心 3.获取手机&#xff1a;文档中心 4.获取昵称头像&#xff1a;文档中心 首先创建 request 若要获取手机号&#xff0c;scope必填 phone&#xff0c;permissions 必填 …...

【Oracle】分区表

个人主页&#xff1a;Guiat 归属专栏&#xff1a;Oracle 文章目录 1. 分区表基础概述1.1 分区表的概念与优势1.2 分区类型概览1.3 分区表的工作原理 2. 范围分区 (RANGE Partitioning)2.1 基础范围分区2.1.1 按日期范围分区2.1.2 按数值范围分区 2.2 间隔分区 (INTERVAL Partit…...

使用 SymPy 进行向量和矩阵的高级操作

在科学计算和工程领域&#xff0c;向量和矩阵操作是解决问题的核心技能之一。Python 的 SymPy 库提供了强大的符号计算功能&#xff0c;能够高效地处理向量和矩阵的各种操作。本文将深入探讨如何使用 SymPy 进行向量和矩阵的创建、合并以及维度拓展等操作&#xff0c;并通过具体…...

网站指纹识别

网站指纹识别 网站的最基本组成&#xff1a;服务器&#xff08;操作系统&#xff09;、中间件&#xff08;web容器&#xff09;、脚本语言、数据厍 为什么要了解这些&#xff1f;举个例子&#xff1a;发现了一个文件读取漏洞&#xff0c;我们需要读/etc/passwd&#xff0c;如…...

Chromium 136 编译指南 Windows篇:depot_tools 配置与源码获取(二)

引言 工欲善其事&#xff0c;必先利其器。在完成了 Visual Studio 2022 和 Windows SDK 的安装后&#xff0c;我们即将接触到 Chromium 开发生态中最核心的工具——depot_tools。这个由 Google 精心打造的工具集&#xff0c;就像是连接开发者与 Chromium 庞大代码库的智能桥梁…...

解析奥地利 XARION激光超声检测系统:无膜光学麦克风 + 无耦合剂的技术协同优势及多元应用

在工业制造领域&#xff0c;无损检测&#xff08;NDT)的精度与效率直接影响产品质量与生产安全。奥地利 XARION开发的激光超声精密检测系统&#xff0c;以非接触式光学麦克风技术为核心&#xff0c;打破传统检测瓶颈&#xff0c;为半导体、航空航天、汽车制造等行业提供了高灵敏…...

9-Oracle 23 ai Vector Search 特性 知识准备

很多小伙伴是不是参加了 免费认证课程&#xff08;限时至2025/5/15&#xff09; Oracle AI Vector Search 1Z0-184-25考试&#xff0c;都顺利拿到certified了没。 各行各业的AI 大模型的到来&#xff0c;传统的数据库中的SQL还能不能打&#xff0c;结构化和非结构的话数据如何和…...

Sklearn 机器学习 缺失值处理 获取填充失值的统计值

💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】 【测试经验】 【人工智能】 【Python】 使用 Scikit-learn 处理缺失值并提取填充统计信息的完整指南 在机器学习项目中,数据清…...