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. 多源最短路 其实就是将所有源头都加入队列, 01矩阵 LCR 107. 01 矩阵 - 力扣(LeetCode) 思路 求每个元素到离其最近0的距离如果我们将1当做源头加入队列的话,无法处理多个连续1的距离存储,我们反其道而行之&…...
【面试题】JVM部分[2025/1/13 ~ 2025/1/19]
JVM部分[2025/1/13 ~ 2025/1/19] 1. JVM 由哪些部分组成?2. Java 的类加载过程是怎样的?3. 请你介绍下 JVM 内存模型,分为哪些区域?各区域的作用是什么?4. JVM 垃圾回收调优的主要目标是什么?5. 如何对 Jav…...
文献综述相关ChatGPT提示词分享
文献综述 ChatGPT 可以帮助提高文献综述的有效性和全面性。ChatGPT可以高效搜索和审查与宝子们课题研究相关的文献资料来源。一些给力的插件工具还可以帮助您总结复杂的研究论文并提取信息以更快更好地消化信息。合理的运用ChatGPT和GPTs可以提高文献综述的清晰度和质量&#…...

Excel 技巧14 - 如何批量删除表格中的空行(★)
本文讲如何批量删除表格中的空行。 1,如何批量删除表格中的空行 要点就是按下F5,然后选择空值条件以定位所有空行,然后删除即可。 按下F5 点 定位条件 选 空值,点确认 这样就选中了空行 然后点右键,选 删除 选中 下方…...
图片生成Prompt编写技巧
1. 图片情绪(场景氛围) 一张图片一般都会有一个情绪基调,因为作画本质上也是在传达一些情绪,一般都会借助图片的氛围去转达。例如:比如家庭聚会一般是欢乐、喜乐融融。断壁残垣一般是悲凉。还有萧瑟、孤寂等。 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小程序来修改信号的值,控制报文的发送等。 目录 一、常用的Panel控件介绍 1.1系统——启动停止按钮 1.2 显示控件——文本框 1.3 显示控件——分组框 1.4 读写控件——按钮 1.…...

【Web】2025-SUCTF个人wp
目录 SU_blog SU_photogallery SU_POP SU_blog 先是注册功能覆盖admin账号 以admin身份登录,拿到读文件的权限 ./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:create-…...

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

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

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

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.系统整体的性能指标(静态) 4.系统整体的性能指标(动态) 三.进制计算 1.任意进制 > 十进制 2.二进制 <> 八、十六进制…...
麒麟系统中删除权限不够的文件方法
在麒麟系统中删除权限不够的文件,可以尝试以下几种方法: 通过修改文件权限删除 打开终端:点击左下角的“终端”图标,或者通过搜索功能找到并打开终端 。定位文件:使用cd命令切换到文件所在的目录 。修改文件权限&…...

自定义提示确认弹窗-vue
最初可运行代码 弹窗组件代码: (后来发现以下代码可运行,但打包 typescript 类型检查出错,可打包的代码在文末) <template><div v-if"isVisible" class"dialog"><div class&quo…...

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

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

Redis - General - 未授权访问漏洞(用户配置问题)
0x01:产品简介 Redis(Remote Dictionary Service,远程数据服务),是一款开源的基于内存的键值对存储系统,其主要被用作高性能缓存服务器使用(比如作为消息中间件和用于 Session 共享)…...
解决 WSL 2 中 Ubuntu 22.04 安装 Docker 后无法启动的问题
问题场景 安装Docker后,执行sudo service docker start启动Docker,提示启动成功 rootDev:~# sudo service docker start * Starting Docker: docker [ OK ]执行su…...

【kafka】Golang实现分布式Masscan任务调度系统
要求: 输出两个程序,一个命令行程序(命令行参数用flag)和一个服务端程序。 命令行程序支持通过命令行参数配置下发IP或IP段、端口、扫描带宽,然后将消息推送到kafka里面。 服务端程序: 从kafka消费者接收…...

AI Agent与Agentic AI:原理、应用、挑战与未来展望
文章目录 一、引言二、AI Agent与Agentic AI的兴起2.1 技术契机与生态成熟2.2 Agent的定义与特征2.3 Agent的发展历程 三、AI Agent的核心技术栈解密3.1 感知模块代码示例:使用Python和OpenCV进行图像识别 3.2 认知与决策模块代码示例:使用OpenAI GPT-3进…...
Admin.Net中的消息通信SignalR解释
定义集线器接口 IOnlineUserHub public interface IOnlineUserHub {/// 在线用户列表Task OnlineUserList(OnlineUserList context);/// 强制下线Task ForceOffline(object context);/// 发布站内消息Task PublicNotice(SysNotice context);/// 接收消息Task ReceiveMessage(…...
从零实现富文本编辑器#5-编辑器选区模型的状态结构表达
先前我们总结了浏览器选区模型的交互策略,并且实现了基本的选区操作,还调研了自绘选区的实现。那么相对的,我们还需要设计编辑器的选区表达,也可以称为模型选区。编辑器中应用变更时的操作范围,就是以模型选区为基准来…...

Python:操作 Excel 折叠
💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】 【测试经验】 【人工智能】 【Python】 Python 操作 Excel 系列 读取单元格数据按行写入设置行高和列宽自动调整行高和列宽水平…...
vue3 字体颜色设置的多种方式
在Vue 3中设置字体颜色可以通过多种方式实现,这取决于你是想在组件内部直接设置,还是在CSS/SCSS/LESS等样式文件中定义。以下是几种常见的方法: 1. 内联样式 你可以直接在模板中使用style绑定来设置字体颜色。 <template><div :s…...

ETLCloud可能遇到的问题有哪些?常见坑位解析
数据集成平台ETLCloud,主要用于支持数据的抽取(Extract)、转换(Transform)和加载(Load)过程。提供了一个简洁直观的界面,以便用户可以在不同的数据源之间轻松地进行数据迁移和转换。…...

selenium学习实战【Python爬虫】
selenium学习实战【Python爬虫】 文章目录 selenium学习实战【Python爬虫】一、声明二、学习目标三、安装依赖3.1 安装selenium库3.2 安装浏览器驱动3.2.1 查看Edge版本3.2.2 驱动安装 四、代码讲解4.1 配置浏览器4.2 加载更多4.3 寻找内容4.4 完整代码 五、报告文件爬取5.1 提…...

深度学习习题2
1.如果增加神经网络的宽度,精确度会增加到一个特定阈值后,便开始降低。造成这一现象的可能原因是什么? A、即使增加卷积核的数量,只有少部分的核会被用作预测 B、当卷积核数量增加时,神经网络的预测能力会降低 C、当卷…...
Python 包管理器 uv 介绍
Python 包管理器 uv 全面介绍 uv 是由 Astral(热门工具 Ruff 的开发者)推出的下一代高性能 Python 包管理器和构建工具,用 Rust 编写。它旨在解决传统工具(如 pip、virtualenv、pip-tools)的性能瓶颈,同时…...