news 2026/6/12 8:00:33

代码随想录 深度优先搜索理论基础

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
代码随想录 深度优先搜索理论基础

一、dfs与bfs的区别:

1.大致区别:

(1)dfs:紧着一个方向去搜,直到搜不下去再换方向(换方向的过程涉及到了回溯)。

(2)bfs:先把本节点所连接的所有节点遍历一遍,走到下一个节点的时候,再把连接节点的所有节点遍历一遍,搜索方向更像的是广度四面八方的搜索过程。

二、dfs的搜索过程:

举例,如下图所示。

1.该图是一个无向图,要搜索从节点1到节点6的所有路径。

2.dfs搜索的第一条路径如下所示:

3.此时找到了节点6,该回头再去搜索其他方向了:

4.又到了节点6,再回头去搜索其他方向:

5.又找到了一条从节点1到节点6的路径,再回头:发现路径7、8和路径7、9都是死路,都走到了已经遍历过的节点。

6.那么节点2所连接的路径和节点3所连接的路径都已经走过了,撤销路径只能向上回退,去撤销当初节点4的选择,也就是撤销路径5改为路径10。

三、代码框架:由于dfs搜索紧着一个方向,且需要回溯,因此使用递归的方式实现是最方便的,代码框架如下所示。

void dfs(参数) { if (终止条件) { 存放结果; return; } for (选择:本节点所连接的其他节点) { 处理节点; dfs(图,选择的节点); // 递归 回溯,撤销处理结果 } }

四、深搜三部曲:

1.确定递归函数和参数:

void dfs(参数)

一般情况下,深搜需要二维数组的数组结构保存所有的路径,需要一维数组保存单一路径,这种保存结果的数组,可以定义为全局变量,以避免函数参数过多。

vector<vector<int>> result; // 保存符合条件的所有路径 vector<int> path; // 起点到终点的路径 void dfs (图,目前搜索的节点)

2.确认终止条件:防止出现死循环、栈溢出等问题。

if (终止条件) { 存放结果; return; }

3.处理当前搜索节点出发的路径:一般就是使用一个for循环去遍历当前搜索节点所能走到的所有节点。

for (选择:本节点所连接的其他节点) { 处理节点; dfs(图,选择的节点); // 递归 回溯,撤销处理结果 }
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/9 23:48:46

网页如何实现大文件上传的暂停与继续功能?

《一个通讯专业菜鸟的"10G文件上传"奇幻漂流记》 前情提要&#xff1a;毕业设计の绝望 大家好&#xff01;我是福州某高校通讯专业大三"准失业人员"。眼瞅着要毕业了&#xff0c;导师说&#xff1a;“做个文件管理系统当毕设吧&#xff0c;找工作也有个作…

作者头像 李华
网站建设 2026/6/9 0:15:19

HTML5如何配合AES加密实现大文件上传存储?

中石油旗下子公司大文件传输系统技术方案 一、项目背景与需求分析 作为中石油集团旗下专注于能源信息化领域的子公司&#xff0c;我司长期服务于政府及军工单位&#xff0c;在能源管理、安全生产等关键领域积累了丰富的行业经验。本次政府招投标项目提出的大文件传输需求具有…

作者头像 李华
网站建设 2026/6/9 13:02:53

LevelDB高性能存储:从业务痛点到架构选型的实战指南

LevelDB高性能存储&#xff1a;从业务痛点到架构选型的实战指南 【免费下载链接】leveldb LevelDB is a fast key-value storage library written at Google that provides an ordered mapping from string keys to string values. 项目地址: https://gitcode.com/GitHub_Tre…

作者头像 李华
网站建设 2026/6/11 22:03:08

得意黑字体深度解析:从设计原理到实战应用的完整手册

在当今数字化设计环境中&#xff0c;字体选择往往成为项目成败的关键因素。设计师们经常面临这样的困境&#xff1a;传统黑体过于严肃呆板&#xff0c;而现代几何字体又缺乏人文温度。得意黑&#xff08;Smiley Sans&#xff09;作为一款在人文观感和几何特征中寻找平衡的中文黑…

作者头像 李华
网站建设 2026/6/9 19:59:08

30、Linux 存储管理:LVM 与 RAID 详解

Linux 存储管理:LVM 与 RAID 详解 1. 引言 随着硬盘价格降低、容量增大,许多系统开始使用多个硬盘。Linux 提供了两种管理硬盘的方法:逻辑卷管理(LVM)和独立磁盘冗余阵列(RAID)。LVM 可将多个硬盘组织成逻辑卷,RAID 则能将相同数据存储在多个硬盘的不同位置,提供数据…

作者头像 李华
网站建设 2026/6/10 10:54:13

荣耀路由Pro固件升级指南:3步解决WiFi卡顿与安全隐患

荣耀路由Pro固件升级指南&#xff1a;3步解决WiFi卡顿与安全隐患 【免费下载链接】荣耀路由ProWS851固件下载 荣耀路由Pro(WS851)固件下载 项目地址: https://gitcode.com/open-source-toolkit/d5aac 还在为家里的WiFi频繁断连而烦恼吗&#xff1f;当你的荣耀路由Pro(WS…

作者头像 李华