深度优先搜索算法(1)——定义

【算法学习】搜索算法之深度优先搜索 深度优先搜索(DFS)算法是一种用于遍历或搜索树或图的算法。它的基本思想是尽可能深地搜索图的分支,直到到达叶节点或无法再深入为止,然后回溯到前一个节点,继续探索其他分支。这种搜索策略可以确保图中的每个节点都被访问到,除非它是一个环。深度优先搜索的实现通常使用递归或栈来实现。对于树或图的遍历,可以从根节点或任意节点开始,然后沿着某个分支深入搜索,直到达到叶节点或无法再深入为止。在这个过程中,需要记录已经访问过的节点,以避免重复访问。当一条路径搜索完成后,需要回溯到上一个节点,继续搜索其他分支。 阅读详情

2. 深度优先搜索算法(DFS)

2.1 定义/用途

从初始状态出发,沿着一条路径尽可能向深处探索,走到无法继续前进时,回溯到上一层,尝试其他分支,持续遍历状态空间,寻找目标解的搜索算法。

光看定义,DFS和枚举有几分相似。实际上,严格来讲DFS和暴力枚举的效率是相同的(大O表示法),但是搜索通常会带来更少的不必要情况列举,从而加快速度。

2.2 算法描述

DFS的内容常被戏称为“一条路走到黑”,这种算法不那么公式化,一般需要具体情况具体分析。

比如,使用树结构表示所有可能的情况

A

B

C

D

E

F

G

H

I

J

K

那么DFS搜索的顺序就是A→B→F→G→H→C→I→D→J→K→EA\rightarrow B \rightarrow F \rightarrow G \rightarrow H \rightarrow C \rightarrow I \rightarrow D \rightarrow J \rightarrow K \rightarrow EA→B→F→G→H→C→I→D→J→K→E

这和后面将会学到的DFS遍历树有些相像,简单说就是

是

否

找到节点

节点满足条件?

继续DFS子节点

回溯

DFS通常使用递归实现。下面是伪代码模板,还是树形图举例:

void dfs(int step)
{
    // 递归终点:满足条件输出答案
    if(step == 目标)
        return;

    for(枚举每一种选择){
        // 做出选择
        vis[x] = true;
        // 向下一层搜索
        dfs(step + 1);
        // 回溯!撤销本次选择
        vis[x] = false;
    }
}

一般情况下,DFS函数总有个参数表示递归深度,用来及时终止DFS。

2.3 经典模板题

2.3.1 例题1:图遍历(最简单DFS)

题目:给定无向图,从1号点出发,遍历所有连通节点
邻接表存储图

代码位置:2\template\dfs_chart.cpp

#include <iostream>
#include <vector>
using namespace std;

vector<int> edge[105];
bool vis[105];

void dfs(int u)
{
    cout << u << " ";
    vis[u] = true;
    for(int v : edge[u])
    {
        if(!vis[v])
            dfs(v);
    }
}

int main()
{
    int n,m;
    cin >> n >> m;
    for(int i=1;i<=m;i++)
    {
        int a,b;
        cin >> a >> b;
        edge[a].push_back(b);
        edge[b].push_back(a);
    }
    dfs(1);
    return 0;
}

2.3.2迷宫DFS(网格地图)

'.'空地,'#'墙;起点(1,1),终点(n,m),寻找是否存在通路

网格DFS四个方向:上下左右

代码位置:2\template\dfs_maze.cpp

#include <iostream>
using namespace std;

char mp[105][105];
bool vis[105][105];
int n, m;
int dx[] = {-1, 1, 0, 0};
int dy[] = {0, 0, -1, 1};

// x,y 当前坐标
bool dfs(int x, int y)
{
    // 越界,碰到墙,访问过 → 走不通
    if (x < 1 || x > n || y < 1 || y > m || mp[x][y] == '#' || vis[x][y])
        return false;

    // 到达终点
    if (x == n && y == m)
        return true;

    vis[x][y] = true;

    // 四个方向尝试
    for (int i = 0; i < 4; i++)
    {
        int nx = x + dx[i];
        int ny = y + dy[i];
        if (dfs(nx, ny))
            return true;
    }
    // 四个方向全部走不通
    return false;
}

int main()
{
    cin >> n >> m;
    for (int i = 1; i <= n; i++)
        cin >> mp[i] + 1;
    if (dfs(1, 1))
        cout << "可以到达终点";
    else
        cout << "无路可走";
    return 0;
}

2.4 小结

DFS核心注意点

  1. 去重:vis访问标记数组
    没有vis数组 → 出现环路,无限递归→栈溢出RE。

  2. 递归出口一定要写!
    缺少出口,无限递归直接运行错误。

  3. 回溯什么时候用?

  • 只遍历图/连通块:不需要撤销标记;
  • 枚举所有可行方案(路径、选数字、排列):搜索完一定要撤销标记 vis=false。
[算法]DFS(深度优先搜索)C++ 1.DFS简介 深度优先搜索(Depth First Search)一种用于遍历或搜索树或图的算法。 沿着树的深度遍历树的节点,尽可能深的搜索树的分支。当节点v的所在边都己被探寻过或者在搜寻时结点不满足条件,搜索将回溯到发现节点v的那条边的起始节点。整个进程反复进行直到所有节点都被访问为止。属于盲目搜索,最糟糕的情况算法时间复杂度为O(!n)。 ps:回溯法(探索与回溯法)是一种选优搜索法,又称为... 阅读详情

相关推荐

深度优先搜索(1)

深度优先搜索(1) 深度优先搜索概念: 深度优先搜索所遵循的搜索策略是尽可能“深”地搜索图。 讲通俗一点,深度优先搜索其实像在走迷宫,遇到一个岔路口,先选则一条路,当发现这条路是死路时,又返回岔路口选择第二条路,直至找到出口。 在尝试优先搜索中: ⑴对于最新发现的结点,它还有以此为起点而未搜索的边,就沿此边继续搜索下去。 ⑵当结点v的所有边都已被探寻过,搜索将回溯到发现结点v有那条边的始结点。 ⑶...

小哼007的博客 2359

DFS(深度优先搜索)

DFS

2201_75956916的博客 1122

秒懂算法 | 子集树模型——0-1背包问题的回溯算法

介绍0-1背包问题的解形式、解空间结构、搜索条件及深度优先搜索的递归设计。

不断学习,不断进步,提高自己 1549

树,深度优先搜索,数字排列

代码中,首先输入一个正整数n作为全排列的个数,然后调用dfs(0)函数进行搜索。dfs函数定义了当前放置第u个数字的情况,当u等于n时,打印出当前排列,否则继续搜索和回溯。每一次放置数字之后都会更新state数组表明哪些数字已经被使用。最终通过递归实现了所有可能的排列。一个简单的全排列算法,通过深度优先搜索(DFS)实现。从1到n的数字进行全排列,即将这些数字重新排列,使得它们在新排列中的每一种可能都能出现。

weixin_72735399的博客 369

C++算法之深度优先搜索算法详解

1.深度优先搜索算法          深度优先搜索是一种在开发爬虫早期使用较多的方法。它的目的是要达到被搜索结构的叶结点(即那些不包含任何超链的HTML文件) 。在一个HTML文件中,当一个超链被选择后,被链接的HTML文件将执行深度优先搜索,即在搜索其余的超链结果之前必须先完整地搜索单独的一条链。深度优先搜索沿着HTML文件上的超链走到不能再深入为止,然后返回到某一个HTML文件,再继续选择...

程序猿老樊的博客 2万+

3 种 VLA 模型动作表示方案对比:RT-2 离散化 vs π0 流匹配 vs HybridVLA 混合架构

本文深入对比了三种VLA模型动作表示方案:RT-2离散化、π0流匹配和HybridVLA混合架构。分析了各自的技术原理、优势与局限性,并提供了应用场景选择指南,帮助研究者在具身智能领域做出更优的技术选型决策。

weixin_29031161的博客 319

深度优先搜索(C语言组合数实例)

xxx+xxx=xxx 将数字1-9填入,每个数字只能用一次,需要获得组合 思路:可以利用标记法来做,先定义a[10],来表示这9个数,从a[1]--a[9],每次这样我们就可以来标记这个数了. #include&lt;stdio.h&gt; int main(){ int a[10],i,total=0,book[10],sum; for(a[1]=1;a[1]&lt;=9;a[1]...

waectr的博客 3180

STM32H743的FDCAN使用方法(1):STM32CubeMX初始化代码生成

STM32H743的FDCAN使用方法(1):STM32CubeMX初始化代码生成。

kevin1499的博客 2565

算法设计: 五、回溯法(1. 0-1 背包问题)—— C++实现 - 算法分析

回朔法 回朔法有通用解题法之称,可以系统地搜索一个问题的所有解或者任一解, 他是一个即带有系统性又带有跳跃性的搜索算法。 回朔法算法解题的一般思路: 针对所给问题,定义问题的解空间; 确定易于搜索的解空间结构; 以深度优先的方式搜索解空间。 利用回朔法求解 0-1 背包问题。 我们有 n 种物品,物品 j 的重量为 wj,价格为 pj。我们假定所有物品的重 量和价格都是非负的。背包所能承受的最大重量为 c。如果限定每种物品只能选 择 0 个或 1 个。 有六件物品,体积和价值见下表,背包容量为 25

demo_yo的博客 1365

PCL RANSAC拟合空间圆【2026最新版】

RANSAC三维点云空间3D圆拟合。博客长期更新,本文最新更新时间为:2026年4月13日。代码在PCL1.15.0中测试通过

点云侠的博客 7454

RK3568_Android15适配以太网网卡gmac+国产phy芯片YT8531

本文介绍了在Android15 SDK上适配正点原子ATK-DLRK3568开发板网卡的过程。开发板采用GMAC接口搭配YT8531C PHY芯片,包含两个千兆网口。主要内容包括:硬件原理图确认、网络链路连接方式、内核DTS配置(包括GMAC0和GMAC1的参数设置)、PHY驱动适配(基于motorcomm.c驱动文件)、PHY寄存器读写调试方法以及MAC地址设置方式。文章还分析了常见问题,如网卡注册后无法ping通网络的故障现象。通过详细的硬件确认和软件配置,实现了双网卡在Android系统上的完整适配。

Android/Linux驱动开发传帮带学习,让驱动入门门槛更低! 2014

01背包之深度优先搜索法

#include #include #include #include using namespace std; #define N 500 struct Bag { int id; int w; int v; double wv; }; int C,n,Wsum,Vsum,best; struct Bag bag[N]; int tempans[N],ans

kb1181的专栏 401

cesium 实现经纬线绘制和经纬度标注

废话不对数直接上线效果图及代码 1.效果图 2.实现代码 <!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width,initial-scale=

一碗老面的博客 2569

深度优先搜索

深度优先搜素

qq_39034977的博客 217

dht11在oled上显示温度 stm32l432kc,如何实现?

🏆 本文收录于《全栈Bug调优(实战版)》专栏,致力于分享我在项目实战过程中遇到的各类Bug及其原因,并提供切实有效的解决方案。无论你是初学者还是经验丰富的开发者,本文将为你指引出一条更高效的Bug修复之路,助你早日登顶,迈向财富自由的梦想🚀!同时,欢迎大家关注、收藏、订阅本专栏,更多精彩内容正在持续更新中。让我们一起进步,Up!Up!Up!    备注: 部分问题/难题源自互联网,经过精心筛选和整理,结合数位十多年大厂实战经验资深大佬经验总结所得,数条可行方案供所需之人参考。

**My Coding Family** 1200

基于Lstm+transformer的刀具磨损预测实战

基于Lstm+transformer的刀具磨损预测实战

2906

深度优先搜索 递归

深度优先搜索 递归

Tangyongqi1111的博客 227

【多模态实验总结】整理了几十篇文章,理清 多模态目标检测 在写论文中需要做哪些实验

此篇文章中将多模态目标检测所做的实验,分成了各个类别,目的是为了对多模态的实验有一个清晰的理解。可以看到,很多表格中放的并不是做了单一的某一个对比,而是将提出的模型,在不同的骨干、数据集上的效果与基线进行对比,使内容更全面。因此这里提到的各种实验,大家在后续改进写论文过程中可以根据自己的论文内容进行整合。对于这里提到的这些文章,大家都可以看看,我只是按照我这里的分类截取了部分实验,这里提到的所有实验在每篇文章中也基本能看到相应的实验。

Limiiiing的博客 3138

回溯算法非递归背包问题c语言,回溯算法---0-1背包问题

引言:这道题目老师强调了肯定要考,所以只有硬着头皮将其复习了;下面是自己学习回溯算法的学习,仅供参考;一:基本概念:回溯算法:“回朔法”有通用的解题方法之称。使用它可以系统搜索一个问题的所有解或者一个解。回溯法是一个即带有系统性有带有跳跃性的算法。它在问题的解空间树中,按照深度优先的策略,从根节点出发搜索解空间树。算法搜索到解空间的任意一点时先判断该点是否包含问题的解,如果肯定不包含,就跳过对以该...

weixin_31278549的博客 1111

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

所有可能的路径(深度优先搜索、图)

leetcode链接 分享原因:图的遍历 一直没怎么练过 目前的理解 就是回溯 题目: 给你一个有 n 个节点的 有向无环图(DAG),请你找出所有从节点 0 到节点 n-1 的路径并输出(不要求按特定顺序) 二维数组的第 i 个数组中的单元都表示有向图中 i 号节点所能到达的下一些节点,空就是没有下一个结点了。 译者注:有向图是有方向的,即规定了 a→b 你就不能从 b→a 。 class Solution { public: vector<vector<int>> r

qq_36255655的博客 776

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

算法详解之深度优先搜索算法

深度优先搜索算法

LQ的博客 2万+

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

(DFS)深度优先搜索算法详解

背景 DFS 英文全称为(Depth First Search),中文简称深度优先搜索算法,其过程为沿着每一个可能的路径向下进行搜索,直到不能再深入为止,并且每一个节点只能访问一次。 算法的搜索遍历图的步骤 (1)首先找到初始节点A, (2)依此从A未被访问的邻接点出发,对图进行深度优先遍历 (3)若有节点未被访问,则回溯到该节点,继续进行深度优先遍历 (4)直到所有与顶点A路径想通的节点都被访问过一次 举个例子,在下方的无向连通图中,假设我们要从起始点A出发,使用深度优先搜索算法进行搜..

202xxx的博客 3万+

深度优先搜索算法

    本文主要部分来源于微信公众号:算法文摘,自己感悟和习题的练习。(侵删)    1. 深度优先搜索算法的概念:        深度优先搜索属于图算法的一种,英文缩写为DFS(Depth First Search.)其过程简要来说是对每一个可能的分支路径深入到不能再深入为止,而且每个节点只能访问一次。如下例:                该图为一个无向图,假设我们从A开始进行深度优先搜索,第...

victoryshen的博客 2万+

【算法入门】深度优先搜索(DFS)

深度优先搜索(DFS) 【算法入门】 郭志伟@SYSU:raphealguo(at)qq.com 2012/05/12 1.前言 深度优先搜索(缩写DFS)有点类似广度优先搜索,也是对一个连通图进行遍历的算法。它的思想是从一个顶点V0开始,沿着一条路一直走到底,如果发现不能到达目标解,那就返回到上一个节点,然后从另一条路开始走到底,这种尽量往深处走的概念即是深度优先的概念。 你可以跳过

raphealguo 8万+

【数据结构与算法】图遍历算法 ( 深度优先搜索 DFS | 深度优先搜索和广度优先搜索 | 深度优先搜索基本思想 | 深度优先搜索算法步骤 | 深度优先搜索理论示例 )

一、深度优先搜索 DFS 1、深度优先搜索和广度优先搜索 2、深度优先搜索基本思想 3、深度优先搜索算法步骤 二、深度优先搜索示例 ( 理论 ) 1、第一轮递归 2、第二轮递归 3、第三轮递归 4、第四轮递归 5、第五轮递归 6、第六轮递归 7、第七轮递归

让 学习 成为一种 习惯 ( 韩曙亮 の 技术博客 ) 9292

【图计算算法‌】深度优先搜索(DFS)算法

深度优先搜索算法(Depth-First Search,简称DFS)是一种用于遍历或搜索树或图的算法。该算法沿着树的深度遍历树的节点,尽可能深地搜索树的分支。当节点v的所在边都已被探寻过,搜索将回溯到发现节点v的那条边的起始节点,这一过程一直进行到已发现从源节点可达的所有节点为止。如果还存在未被发现的节点,则选择其中一个作为新的源节点并重复以上过程,直到所有节点都被访问为止。

大雨淅淅的博客 5993
上一篇: 【算法竞赛必刷】前缀和&差分全套精讲|从零基础模板到高阶真题(附完整可运行代码)
下一篇: 深度优先搜索算法(2)——例题详解
ZH翰
博客等级 码龄123天 13粉丝 18原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值