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

深度优先搜索(dfs)

深度优先搜索1 什么是图的遍历图的遍历Graph Traversal指的是从图中的某一个顶点开始按照一定规则访问图中的所有顶点并且每个顶点只访问一次的过程。简单理解就像在一个由很多点和线组成的网络里按某种顺序把所有点都走一遍。2.深度优先搜索理论基础深度优先搜索DFSDepth First Search是一种图的遍历算法它从一个节点出发沿着每一条边一直深入到不能继续的地方再回溯到最近的一个有未被探索的邻接节点的节点继续深度搜索直到所有节点都被访问。从顶点0开始有两个顶点可以继续往下遍历1,2两个任选其一进行访问假设选择顶点1接下来有3个选择我们知道回到顶点0无意义因为我们已经访问过他了所以我们选择新的顶点来访问那么我们访问顶点2顶点2有两个选择顶点0或1但他们都被访问过所以这里我们无法继续往下了只能原路退一步回到顶点1深度优先搜索DFS的回退路径必须按照它原来的遍历路径返回。原因是 DFS 的回退本质上依赖 栈结构或递归调用栈而栈的特点是 后进先出LIFO。也就是说你是从哪条路径走进去的就必须沿着那条路径退回来。从顶点1开始我们还有两个未探索过得顶点即顶点3和顶点4我们访问顶点3从顶点3出发只能到达顶点5所以我们访问顶点5从顶点5出发可以访问6、7、8继续访问顶点6现在有到达了一个死胡同类似顶点2所以我们要后退一步到达顶点5接下来选择顶点7开始访问从顶点7出发访问的唯一路径是顶点8从顶点8出发访问的唯一路径只有一条路选择访问顶点9到达顶点9后进入了死胡同所以回到顶点8因为我们已经访问过了顶点8的所有顶点所以同理我们再次回退一步回到顶点77也被访问过回退一步到达顶点5顶点5也都被访问过所以我们回退到顶点3相同的回退到顶点1发现顶点4未被访问我们访问顶点4到达顶点4后无其他未访问过的节点了所以我们回退到顶点1顶点1也没有未访问过的节点了最后我们回退到了出发顶点0完成遍历我们会一直访问新的节点直到遇到死胡同深度优先搜索的序列并不唯一在多个顶点可访问时我们可以选择不同的顶点来生成另外一个序列最好始终选择较小值的节点3.代码框架正是因为dfs搜索可一个方向并需要回溯所以用递归的方式来实现是最方便的。就递归函数的下面例如如下代码voiddfs(参数){处理节点dfs(图选择的节点);// 递归回溯撤销处理结果}可以看到回溯操作就在递归函数的下面递归和回溯是相辅相成的。我们在回顾一下回溯法的代码框架voidbacktracking(参数){if(终止条件){存放结果;return;}for(选择本层集合中元素树中节点孩子的数量就是集合的大小){处理节点;backtracking(路径选择列表);// 递归回溯撤销处理结果}}回溯算法其实就是dfs的过程这里给出dfs的代码框架voiddfs(参数){if(终止条件){存放结果;return;}for(选择本节点所连接的其他节点){处理节点;dfs(图选择的节点);// 递归回溯撤销处理结果}}可以发现dfs的代码框架和回溯算法的代码框架是差不多的。4.DFS基本步骤确认递归函数参数voiddfs(参数)通常我们递归的时候我们递归搜索需要了解哪些参数其实也可以在写递归函数的时候发现需要什么参数再去补充就可以。一般情况深搜需要 二维数组数组结构保存所有路径需要一维数组保存单一路径这种保存结果的数组我们可以定义一个全局变量避免让我们的函数参数过多。例如这样vectorvectorintresult;// 保存符合条件的所有路径vectorintpath;// 起点到终点的路径voiddfs(图目前搜索的节点)确认终止条件终止条件很重要很多时候写dfs的时候之所以容易死循环栈溢出等等这些问题都是因为终止条件没有想清楚。if(终止条件){存放结果;return;}终止添加不仅是结束本层递归同时也是我们收获结果的时候。另外其实很多dfs写法没有写终止条件其实终止条件写在了 隐藏在下面dfs递归的逻辑里了也就是不符合条件直接不会向下递归。处理目前搜索节点出发的路径一般这里就是一个for循环的操作去遍历 目前搜索节点 所能到的所有节点。for(选择本节点所连接的其他节点){处理节点;dfs(图选择的节点);// 递归回溯撤销处理结果}5.DFS例题所有可达路径对应题目代码随想录卡码网所有可达路径力扣7975.1题目5.2思路深搜三部曲来分析题目确认递归函数参数首先我们dfs函数一定要存一个图用来遍历的需要存一个目前我们遍历的节点定义为x。还需要存一个n表示终点我们遍历的时候用来判断当 xn 时候 标明找到了终点。其实在递归函数的参数 不容易一开始就确定了一般是在写函数体的时候发现缺什么参加就补什么至于 单一路径 和 路径集合 可以放在全局变量那么代码是这样的vectorvectorintresult;// 收集符合条件的路径vectorintpath;// 0节点到终点的路径// x目前遍历的节点// graph存当前的图// n终点voiddfs(constvectorvectorintgraph,intx,intn)确认终止条件什么时候我们就找到一条路径了当目前遍历的节点 为 最后一个节点 n 的时候 就找到了一条 从出发点到终止点的路径。// 当前遍历的节点x 到达节点nif(xn){// 找到符合条件的一条路径result.push_back(path);return;}处理目前搜索节点出发的路径接下来是走 当前遍历节点x的下一个节点。首先是要找到 x节点指向了哪些节点呢 遍历方式是这样的for(inti1;in;i){// 遍历节点x链接的所有节点if(graph[x][i]1){// 找到 x指向的节点就是节点i}}接下来就是将 选中的x所指向的节点加入到 单一路径来。path.push_back(i);// 遍历到的节点加入到路径中来进入下一层递归dfs(graph,i,n);// 进入下一层递归最后就是回溯的过程撤销本次添加节点的操作。该过程整体代码or(inti1;in;i){// 遍历节点x链接的所有节点if(graph[x][i]1){// 找到 x链接的节点path.push_back(i);// 遍历到的节点加入到路径中来dfs(graph,i,n);// 进入下一层递归path.pop_back();// 回溯撤销本节点}}5.3 完整代码#includeiostream#includevectorusingnamespacestd;vectorvectorintresult;// 收集符合条件的路径vectorintpath;// 1节点到终点的路径voiddfs(constvectorvectorintgraph,intx,intn){// 当前遍历的节点x 到达节点nif(xn){// 找到符合条件的一条路径result.push_back(path);return;}for(inti1;in;i){// 遍历节点x链接的所有节点if(graph[x][i]1){// 找到 x链接的节点path.push_back(i);// 遍历到的节点加入到路径中来dfs(graph,i,n);// 进入下一层递归path.pop_back();// 回溯撤销本节点}}}intmain(){intn,m,s,t;cinnm;// 节点编号从1到n所以申请 n1 这么大的数组vectorvectorintgraph(n1,vectorint(n1,0));while(m--){cinst;// 使用邻接矩阵 表示无线图1 表示 s 与 t 是相连的graph[s][t]1;}path.push_back(1);// 无论什么路径已经是从0节点出发dfs(graph,1,n);// 开始遍历// 输出结果if(result.size()0)cout-1endl;for(constvectorintpa:result){for(inti0;ipa.size()-1;i){coutpa[i] ;}coutpa[pa.size()-1]endl;}}

相关文章:

深度优先搜索(dfs)

深度优先搜索 1 什么是图的遍历 图的遍历(Graph Traversal): 指的是从图中的某一个顶点开始,按照一定规则访问图中的所有顶点,并且每个顶点只访问一次的过程。 简单理解: 就像在一个由很多点和线组成的网络…...

JAVA进阶-锁

1.悲观锁和乐观锁悲观锁:在修改数据时,一定有别的线程来使用,一定会发生并发冲突,所以在获取数据的时候会加锁。JAVA中的synchronized和lock都是悲观锁。乐观锁:在修改数据时,一定没有别的线程来使用&#…...

Cesium快速入门到精通系列教程二十三:综合

一、viewer.cesiumWidget.container.appendChild() 把你自定义的 HTML 元素(弹窗、按钮、图标等)添加到 Cesium 画布的容器里,让它显示在 3D 地球场景上。 // 1. 创建一个自定义弹窗 div const infoDiv = document.createElement(div); infoDiv.style.position = absolute…...

JAVA数据结构 DAY8-堆

本系列可作为JAVA学习系列的笔记,文中提到的一些练习的代码,小编会将代码复制下来,大家复制下来就可以练习了,方便大家学习。 点赞关注不迷路!您的点赞、关注和收藏是对小编最大的支持和鼓励! 系列文章目录…...

2026-03-17 每日作战任务:RAG 语料高效切分(Text Chunking)与处理

2026-03-17 每日作战任务:RAG 语料高效切分(Text Chunking)与处理每日学习代码关联仓库地址:https://gitee.com/lqx_learn/java-ai.git一、 业务场景 昨天我们运用 JDK 17 的 FileChannel 与 MappedByteBuffer,实现了大…...

Android Studio 安装教程(Windows 超详细图文版)

本教程将从 准备工作→ 下载 → Android Studio安装 → SDK配置 → 创建第一个项目 全流程讲解,适合 AndroidAndroid开发零基础入门。 一、Android Studio简介 Android Studio 是 Google 官方推出的 Android应用开发IDE,用于开发 Android APP。它基于 I…...

SPI子系统源码剖析--(2)Spi_Master驱动框架

1. spi_masterspi_master对应spi控制器,是对引脚的管理,同时可以通过cs引脚选择从设备发送消息2. SPI传输概述1.1 数据组织方式使用SPI传输时,最小的传输单位是"spi_transfer",对于一个设备,可以发起多个spi…...

速看!!安全员ABC证靠谱的查询方式有哪几种?分别是怎么查询呢?

很多人报考安全员都会有疑虑,担心自己考的安全员不是正规的,考出来没有用,不能在正规网站查询到,今天星禾智慧老师告诉您安全员ABC靠谱的查询方式,保证你拿到的证书不再有假🍎🧤一、湖北安全员A…...

软件综合项目-mqtt

依赖的第三方库https:CURL库SQLite:SQLite库MQTT库:Paho库MQTT属于应用层协议,支持其实现的传输协议为TCPHTTPS适用于传输的数据量比较大情况,传输方式为字符单向传输MQTT传输数量比较小,二进制传输&#x…...

2026人事系统排行榜:一体化+AI,11家企业谁是TOP选手?

2026年一体化AI人事系统TOP11深度评测:谁领跑AI原生时代?2026年,HR SaaS行业已全面迈入AI原生架构全链路一体化的竞争新阶段。企业对人系统的核心诉求,从“功能叠加AI”进化为“从底层架构融入AI”,要求AI能贯穿招聘、…...

ssm+java2026年毕设社区疫情管理系统【源码+论文】

本系统(程序源码)带文档lw万字以上 文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容一、选题背景关于社区公共卫生应急管理问题的研究,现有研究主要以宏观层面的城市公共卫生体系构建、重大疫情应急响应机制为主&…...

【亲测好用】数据权限管理能力演示

导言: 作为一名企业管理者或业务人员,您是否曾遇到过这样的烦恼:(1)销售人员看到了不该看的财务数据?(2)合作伙伴访问了超出约定范围的信息?(3)不…...

Paperzz AI 毕业论文写作:从选题到成文,本科论文高效交付的智能解决方案

Paperzz-AI官网免费论文查重复率AIGC检测/开题报告/文献综述/论文初稿paperzz - 毕业论文-AIGC论文检测-AI智能降重-ai智能写作https://www.paperzz.cc/dissertation 在本科毕业论文的创作路上,从确定选题到完成初稿,从文献梳理到格式规范,每…...

Paperzz AI 初稿引擎:重构本科毕业论文写作,从选题到终稿一站式高效通关

Paperzz-AI官网免费论文查重复率AIGC检测/开题报告/文献综述/论文初稿paperzz - 毕业论文-AIGC论文检测-AI智能降重-ai智能写作https://www.paperzz.cc/dissertation 引言 本科毕业论文的创作,是大学生学业生涯的收官之战,也是对专业知识与学术能力的综…...

泰思特电子分享_EMC测试电流探头选型差异性及影响因素探讨

本文主要进行EMC测试电流探头选型差异性及影响因素探讨,围绕电流探头核心技术指标进行介绍,根据EMC测试不同标准、不同测试项目对电流探头的需求差异,分析了电流探头选型的关键影响因素以及国内外主流厂家不同型号产品的对比,为EM…...

基于能量分配的光伏混合储能系统仿真模型 ①光伏:采用mppt控制实现最大功率跟踪 ②蓄电池与超...

基于能量分配的光伏混合储能系统仿真模型 ①光伏:采用mppt控制实现最大功率跟踪 ②蓄电池与超级电容:构成混合储能系统,电池实现连续功率供应,超级电容提供瞬态功率供应 ③拓扑:光伏DC/DC采用boost变换器,混…...

APM使用LUA脚本发送实现遥控器PWM信号输出CAN协议信号

需求:由于舵机是CAN总线舵机,需实现APM开源飞控遥控器输入PWM通道到CAN的发送。 方法1:修改APM固件源码,编译,运行,测试。实现复杂。 方法2:使用lua脚本。实现简单 目前采用方法2,使…...

LangGraph 核心概念

LangGraph是LangChain 生态的 “进阶编排框架”,是 AgentExecutor升级版,基于图结构解决复杂工作流 / 多智能体问题,兼容 LangChain 所有组件。AgentExecutor 是「单智能体固定循环执行器」,适合简单线性任务;LangGrap…...

零基础搭建免费IP代理池:从原理到实战的保姆级指南

在数据驱动型业务中,很多企业都会接触到“IP代理池”这一概念。尤其是在进行公开数据整合、市场信息监测等场景时,单一IP往往难以支撑持续稳定的请求需求,这时代理池就成为重要基础设施。但对于初学者来说,“搭建代理池”听起来复…...

努力学习了一辈子,突然发现学习没什么用了

从小,我是众人眼中的 “学习标兵”。到现在,每天一节法语,一篇英语阅读,依然雷打不动:但最近几个月,随着老杨的“眨眼猫会务智能体”中对报名、签到、查座、AI会务助理的全面 “AI化改造”,老杨…...

大模型的那点事儿

大模型参数调优完全指南:从模型选择到参数配置 作者:虾兵一号 发布时间:2026-03-17 关键词:大模型参数、模型选择、Temperature、Top P、推理参数、LLM调优 一、前言 在使用大模型 API 时,两个问题最让人头疼&#xf…...

python-web自动化-selenium(1)

目录 资源 驱动器下载流程 设置、创建启动浏览器 设置浏览器Options() 创建启动浏览器webdriver.Chrome() 完整代码 打开网页,关闭标签页,关闭浏览器 打开网址get() 关闭当前标签页close() 完整代码 最大化最小化 最大化maximize_window() 最…...

AI智能水库图像识别数据集 水面漂浮物识别 水面分割识别 河道护栏分割数据集 YOLO格式数据集第10573期

数据集文档数据集概览 本数据集为实例分割场景专用数据集,聚焦于水处理场景下的关键目标识别与分割任务,为工业视觉算法提供高质量标注数据支撑。项目内容类别数量及中文名称4类:水面、粗格栅1、粗格栅2、悬浮物数据总量100张数据集格式YOLO核…...

关于密码破解的方式

当重启虚拟机或者开启虚拟机时,当界面跳出时,快速将鼠标点进虚拟机中,按向下或者向上箭头防止界面跳转,并按如下步骤进行:1 在界面中选择第二个选项2 按e键进入如下界面,按向下向上键将光标移动到quiet单词后面&#x…...

SAP 系统配置、落地即用的《SAP 成本分摊循环配置清单》,包含事务码、主数据、循环结构、分配 / 分摊规则、计算公式、案例数据

SAP 系统配置、落地即用的《SAP 成本分摊循环配置清单》,包含事务码、主数据、循环结构、分配 / 分摊规则、计算公式、案例数据一、通用主数据(所有案例共用,先建好)1. 成本中心(标准示例)成本中心名称类型…...

基于MATLAB_SIMULINK_SIMSCAPE建模的用于组件尺寸的电动和混合动力飞机模型

基于MATLAB/SIMULINK/SIMSCAPE建模的用于组件尺寸的电动和混合动力飞机模型第一步:主脚本 (AircraftSizingMain.m) 在 MATLAB 中运行此脚本,它将定义参数并启动仿真。 matlab 编辑 1%% Aircraft Component Sizing Simulation Script 2% 适用于电动 (AE) …...

C 语言03:结构体——自定义数据类型的万能基石

结构体(struct)是 C 语言的核心自定义数据类型,用于将不同类型的数据(如姓名、年龄、日期)打包成一个整体,极大简化了复杂数据的管理。本文从定义到使用,极简解析结构体的核心用法。一、结构体类…...

SAP 成本分摊逻辑与案例(含具体数据)

SAP 成本分摊核心是通过 ** 分配(Allocation)与分摊(Assessment)** 两种循环,将间接成本中心归集的费用,按预设规则(统计指标、比例、作业量等)结转至直接成本中心、生产订单、内部订…...

C语言当中的字符函数

字符分类函数可以很好的帮助我们进行字符的分类其中头文件为<ctype.h>现在举个列子&#xff0c;进行大小写转换islower运用函数的代码int i0&#xff1b;char str【】“CBASJDHsfjaf”&#xff1b;char c;while(str[i]){cstr[i];if(islower(c))c-32;putchar(c)i;}远高于平…...

思特威SC1220IOT——为AI眼镜量身打造的超低功耗影像之心

导读: 随着AI大模型向端侧迁移,AI智能眼镜被视为继智能手机之后最具潜力的下一代个人计算平台。然而,要在极其有限的轻量化镜架中塞进高性能的“眼睛”,同时保证全天候续航与即时响应,对核心的CMOS图像传感器提出了严苛挑战。近日,国内技术先进的CMOS图像传感器供应商思特…...