深度优先搜索(DFS)

C++算法篇:DFS超详细解析(1)--- 无向图基本概念 文章目录一、DFS是什么?二、DFS的基本框架三、DFS-tree 一、DFS是什么?     DFS(Depth First Search) ,即 深度优先搜索 ,是一种遍历图的方式,对于下图(设从u开始访问) 若先访问了v点: 则下一步会访问v的子节点w点: 发现无路可走,则回溯回v,再回到u,之后前往x。 总结一下,dfs会在搜索到新点时优先访问以改点为起点的子节点,并在所有子节点访问完成后回溯,可以看出,dfs和递归殊途同归。 相反地,有BFS(Breath First Search)广度优先搜索, 阅读详情

深度优先搜索百度定义

图的深度优先搜索(Depth First Search),和树的先序遍历比较类似。

它的思想:假设初始状态是图中所有顶点均未被访问,则从某个顶点v出发,首先访问该顶点,然后依次从它的各个未被访问的邻接点出发深度优先搜索遍历图,直至图中所有和v有路径相通的顶点都被访问到。 若此时尚有其他顶点未被访问到,则另选一个未被访问的顶点作起始点,重复上述过程,直至图中所有顶点都被访问到为止。

显然,深度优先搜索是一个递归的过程。

以图为例:
这里写图片描述

对上图进行深度优先搜索
步骤:
第一步: 搜索节点A

第二步 :搜索A的临节点B

在第1步访问A之后,接下来应该访问的是A的邻接点,即”B,C”中的一个。但在本文的实现中,顶点ABCDEF是按照顺序存储,B在”C”的前面,因此,搜索问B。

第三步:搜索B的临节点D

第四步:搜索D的临节点E

第五步:E没有临节点,回退到D,再回退到B,再回退到A,发现A的临节点C没有被搜索,访问C

第六步:访问C的临节点F

最终搜索的顺序是A->B->D->E->C->F

对于整个过程,编程实现其实有两个注意点!

1>记录已经搜索的点,伪代码如下

if (0 == flag[A]) {
    访问A节点信息;
    flag[A] = 1;
}

2>回退,这也是搜索算法的核心点,我们可以采用递归,也可以使用栈进行存储,其实递归调用也是通过一个隐形栈来实现,即将整个程序的运行空间安排在一个栈中。每当运行一个函数时,就在栈顶分配空间,函数退出后,释放这块空间。当前运行的函数一定在栈顶。

假设搜索节点的函数是SearchNodeInfo(Node* pNode);,根节点是pRoot,也就是A(开始搜索的节点)
DFS算法可以这样实现:伪代码

SearchNodeInfo(Node* pNode) 
{
    if (NULL == pNode || 1 == flag[pNode->flag]) {
        return;//递归函数最重要的就是退出点
    }
    for (int i = 0; i < pNode->sonNumber; ++i) {
        if (0 == flag[pNode->son[i]]) {
            SearchNodeInfo(pNode->son[i]);
        }
    }
    访问pNode节点信息//具体是干啥要看实际需求
    flag[pNode->flag] = 1;//函数退出的关键
    return;
}

int main
{
    初始化所有的Node->flag = 0;
    SearchNodeInfo(pRoot);
    return 0;
}

来复盘一下上图的搜索过程

在主函数里面调用SearchNodeInfo(pRoot);
这个图的存储方式B,C是A的儿子,E是D,B的儿子,F是C的儿子 。

根节点pRoo是A,首先进入函数的是

即 1:把函数SearchNodeInfo(A节点)入栈
进入第一for(A的儿子)
2:把SearchNodeInfo(B节点)入栈(B是A的第一个儿子)
进入第二个for(B的儿子)
3:把SearchNodeInfo(D节点)入栈(D是B的第一个儿子)
然后对于第二个for
4:把SearchNodeInfo(:E节点)入栈(E是B的第一个儿子)
由于ED都没有儿子了,没有For循环,直接访问节点信息
然后退出。
然后第二个for退出,访问E,再访问B
由于第二for退出,这个时候回退到第一个For
5:把SearchNodeInfo(C节点)入栈(C是A的第二个儿子)
6:把SearchNodeInfo(F节点)入栈(F是C的唯一儿子)
然后访问F, C
然后第二个for退出访问A信息

大概的意思就是

//对于最外层A
Search(A);
for(int i = 0; i < A->sonNumber; ++i) {
   Search(B);
   for(int j = 0; j < B->sonNumber; ++j) {
       Search(D);
       for(int k = 0; k < D->sonNumber; ++k) {
           Search(E);
           //E没有儿子,直接访问E节点信息然后退出
           对于这个for D只有一个儿子,退出这层for
       }
       访问D节点信息
       对于这个for B有两个儿子,但是E已经被访问退出这层for
   }
   访问B节点信息,然后对于A节点来说
   继续搜索A的第二个儿子C
   Search(C);
   for(int l = 0; l < C->sonNumber) {
       //由于F没有儿子直接访问F信息
       退出这层for
   }
   访问C节点信息
}
访问A

以上是实际的调用顺序,及过程。方便理解,这可能是不能再详细的,不能再底层的逻辑了

下面我们来一道题练练手;这是DFS的实际运用

给你很多很多个数字 a1,a2,a3,a4……..an,
你能帮我选出若干个数字,使得他们的和等于k

思路:
对于每个数,只有用与不用两种可能,所以考虑状态转移时,分两种情况。设DFS(i,m)为已经考虑完前i-1个数(从0开始),且前i-1个数和为m,此时,如果m==k,可以立即返回结果(查找成功),如果m!=k,若加入第i个数,状态转移为DFS(i+1,m+ai),若不加,状态转移为DFS(i+1,m)。递归直至i==n,若此时仍未有符合要求的解,返回0。这个算法的复杂度为O(2^n),复杂度为指数级,只能用于处理较小的数据量。

深度优先搜索是一种搜索思路,它从某个状态开始,不断地转移状态直到找到结果或无法转移,然后回退到前一步的状态,继续转移至其他状态,如此不断重复,直至找到最终解。一般采用递归方式。

代码:

    #include<stdio.h>  
    int n,k;  
    int s[100];  
    int DFS(int i,int m)  
    {  
        if(m==k)//结束条件1:找到符合要求的解。  
            return 1;  
        if(i==n)//结束条件2:未找到符合要求的解且当前状态无法再拓展至下一状态。  
            return 0;  
        if(1 == DFS(i+1,m+s[i])|| 1 == DFS(i+1,m))//从当前状态拓展至下一状态。  
            return 1;  
        else return 0;  
    }  
    int main()  
    {  
        scanf("%d%d",&n,&k);  
        for(int i=0;i<n;i++)  
        {  
            scanf("%d",&s[i]);  
        }  
        if(DFS(0,0))  
            printf("Yes\n");  
        else printf("No\n");  
        return 0;  
    }  
c++深度优先搜索DFS 深度优先搜索,又叫DFS,是遍历图或者数的一种算法,本质就是递归。具体方法:先以一个节点为起点,向一个方向扩展,再以新的节点为起点,向一个方向扩展,直到这个方向不满足条件,或者到达这个方向的最深,再往回走,叫做回溯。然后扩展另一个方向,知道整个图都遍历完成。所以叫做深度优先搜索。这种算法极其重要,是每一个会编程的人都必须掌握的一种算法。因为许多东西都可以用它来实现。比如树的遍历,图的遍历,全排列。而且很多题目,如果你不会或者想不出正解,就可以用深搜暴力一下,也能骗得部分分。 阅读详情

相关推荐

深度优先搜索 DFS

1、基本思想 在搜索一幅图时,只需要用一个递归来遍历所有顶点。在访问其中一个顶点时: - 将它标记为已访问 - 递归访问它的所有未标记的邻居顶点 DFS只会访问与起点s连通的所有顶点(而不会访问其他顶点)。如果图是连通的,则所有顶点都会被访问到。 DFS中每条边都会被访问两次,且在第二次时总会发现这个顶点已经被标记过了。 2、算法实现 public class DepthFi...

能能 2651

深度优先搜索

深度优先搜索 一.什么是深度优先搜索 深度优先搜索,Depth First Search, 简称DFS。它从初始节点出发,按预定的顺序扩展到下一个节点,然后从下一节点出发继续扩展新的节点,不断递归执行这个过程,直到某个节点不能再扩展下一个节点为止。此时,则返回上一个节点重新寻找一个新的扩展节点。如此搜索下去,直到找到目标节点,或者搜索完所有节点为止。 如果从位置开始深度优先搜索,则搜索的顺序为: 1→2→3→5→9→10→6→11→12→7→4→81 \to 2 \to 3 \to 5 \to 9 \to

DeepStarSky的博客 1万+

深度优先搜索 (Depth First Search 简称:DFS)

深度优先搜索 (Depth First Search 简称:DFS) 1.搜索算法 利用计算机的高性能有目的地的枚举一个问题的部分或者所有可能情况,从而找到解决问题的方法 2.穷举法(枚举法):典型的搜索算法 在我们遇到的一些问题当中,有些问题我们不能够确切的找出数学模型,即找不出一种直接求解的方法,解决这一类问题,我们一般采用搜索的方法解决。搜索就是用问题的所有可能去试探,按照一定的顺序、规则,不断去试探,直到找到问题的解,试完了也没有找到解,那就是无解,试探时一定要试探完所有的情况,这就是穷举。

weixin_51671500的博客 668

算法数据结构——图的遍历之深度优先搜索算法(Depth First Search)

深度优先搜索算法(Depth First Search):英文缩写为 DFS。是一种用于搜索树或图的算法。所谓深度优先,就是说每次都尝试向更深的节点走。深度优先搜索采用了回溯思想,该算法沿着树的深度遍历树的节点,会尽可能深的搜索树的分支。当节点v的所在边都己被探寻过,搜索将回溯到发现节点v的那条边的起始节点。这一过程一直进行到已发现从源节点可达的所有节点为止。如果还存在未被发现的节点,则选择其中一个作为源节点并重复以上过程,整个进程反复进行直到所有节点都被访问为止。

白话机器学习 1万+

Java-DFS(深度优先搜索)

原理深度优先搜索的基本思路是从一个节点开始,依次访问它的每一个邻居节点,直到达到一个没有未被访问的邻居的节点为止。这个过程可以使用递归或者栈来实现。其特点是尽可能深入每一个分支,然后再回溯。DFS算法常用于解决以下类型的问题:在实际使用中,图的表示通常有以下几种方式:在下面的示例中,我们使用邻接表来表示图,因为它存储效率更高,适合大多数情况。以下是通过递归方式实现深度优先搜索的详细代码,并附带注释以帮助理解每个部分的功能 栈的实现方式不直接依赖于系统的调用栈,这对于深度大、可能导致栈溢出的情况特别有用

2301_81543552的博客 1449

C++深度优先搜索DFS

扩展新的节点,不断递归执行这个过程,直到某个节点不能再扩展下一个节点为止。此时,则返回上一个节点重新寻找一个新的扩展节点。如此搜索下去,直到找到目标节点,或者搜索完所有节点为止。

闻缺陷则喜何志丹 1748

搜索算法---深度优先搜索

一、通过下面一个问题总结深度优先搜索 问题:有编号为1~3的三张牌和编号为1~3的三个盒子,将三张牌放到三个盒子中且每个盒子只能放一张牌,问:一共有多少种方法? 根据题意,每个盒子放的牌有三种可能(1号盒子放的牌可能是1、2或3,2号...)。假定,从1号盒子开始放,接着放2号、3号。 给1号盒子放牌时,由于1号盒子是第一个放的,因此有三种选择:1、2、3号牌。假定,第一次放入1号牌,第二次放入2号牌... 给2号盒子放牌,此时1号盒子已经放入了1号牌,因此2号盒子只能从2、3号盒子选一张牌放入,假

qq_47406941的博客 5349

vrep小车避障算法_V-REP 多车道巡线与避障

任务概要在给定的赛道中,实现多车道的避障和视觉巡线。避障算法没有限定,可使用人工势场、RRT等路径规划算法。车体大小、赛道信息以及参考资料在此处下载。完成情况已学习并能初步使用 V-REP Python Remote API 接口,实现 Python 与 V-REP 的功能交互。已实现基于视觉传感器的多车道巡线功能。已实现基于视觉传感器的多车道避障功能。V-REP Python Remote AP...

weixin_39692037的博客 1832

深度优先遍历(bfs)java

深度优先遍历(bfs)java

Lbility的博客 1766

VSCode 远程开发:实现服务器图形化界面(GUI)的高效操作指南

本文详细介绍了如何通过VSCode远程开发实现服务器图形化界面(GUI)操作,包括X11转发原理、完整配置指南和实战测试。通过安装Xming、配置SSH连接和服务器端设置,开发者可以高效地在本地显示远程GUI应用,提升开发效率。

weixin_29245767的博客 292

Keil 丢失编译器版本5、内核文件core_cm3.c报错

若用的是旧版本的core_cm3.c ,就使用编译器v5编译工程;若想用编译器v6,就更新4个相关的内核文件:(CMSIS:Cortex Microcontroller Software Interface Standard,ARM Cortex™ 微控制器软件接口标准)

qq_52804040的博客 6238

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

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

202xxx的博客 3万+

利用 Openocd 和 FT2232H 实现 ARMv8(Coretex-A53)高效调试方案

本文详细介绍了如何利用开源工具OpenOCD与高性能USB转接芯片FT2232H,构建一套针对ARMv8架构(如Cortex-A53)的高效、低成本调试方案。内容涵盖从环境搭建、驱动配置、核心调试架构解析到实战问题排查的全过程,帮助开发者实现对多核处理器的透明、可控调试,是嵌入式Linux及底层开发的实用指南。

weixin_29163581的博客 280

【DFS】深度优先搜索递归方式讲解

前言 记得第一次接触到DFS还是在去年大概三四月份,当时也是在准备比赛的时候听说DFS很重要(原谅我是个小白),然后就去Google了一波什么叫做DFS,当时的我刚开始学习C++,还没有学习数据结构,讲道理当时我看懂了算法原理,但是对于什么图呀,树呀的还真是一窍不通。后边学习了数据结构后,对于DFS原理也是相当的了解(自我感觉),但从来没有总结过,今天主要是进行DFS的算法进行简单的自我总结,一...

仰起嘴角 4万+

centos7 python3.12.1 报错 No module named _ssl,坑我几个小时

网上的教程很多,但几乎是无效的,跟着我这教程,可以完美解决。

Amio_的博客 1万+

复现CVE-2014-085(Apache ZooKeeper 未授权访问漏洞)

默认安装配置完的zookeeper允许未授权访问,管理员未配置访问控制列表(ACL)。导致攻击者可以在默认开放的2181端口下通过执行envi命令获得大量敏感信息(系统名称、java环境)导致任意用户可以在网络不受限的情况下进行未授权访问读取数据。

记录并分享学习安全的知识点.. 2173

DFS——深度优先搜索

深度优先搜索,是一种常用的图遍历算法,用于在图或树数据结构中遍历所有节点。

m0_74421524的博客 4685

RK356x U-Boot研究所(命令篇)3.12 mtd命令的用法

RK356x U-Boot研究所(命令篇)3.12 mtd命令的用法

Systemcall名屋 1685

深入浅出,详解深度优先搜索(DFS)

本文将从原理出发,结合例子深入浅出地讲解深度优先搜索

浪里小白龙nbw的博客 2万+

【25届数字IC秋招总结】面试经验15——比特大陆-算能

25届数字ic面试记录——比特大陆-算能

lalala0635的博客 553

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

DFS(深度优先搜索算法)

1.dfs基本思想 dfs:深度优先搜索算法(英语:Depth-First-Search,DFS)是一种用于遍历或搜索树或图的算法.沿着树的深度遍历树的节点,尽可能深的搜索树的分支。当节点v的所在边都己被探寻过,搜索将回溯到发现节点v的那条边的起始节点。这一过程一直进行到已发现从源节点可达的所有节点为止。如果还存在未被发现的节点,则选择其中一个作为源节点并重复以上过程,整个进程反复进行直到所有节点都被访问为止。属于盲目搜索。简单来说dfs可以看作是一个执着的人,优先往下走。搜索方式如图: 2..

zgdlxs的博客 4万+

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

详解深度优先搜索(DFS,Depth-First Search)

在实际编程中,要注意递归的终止条件和避免无限递归的情况,也要处理好状态回溯,确保解的空间被正确探索。遍历整个网格,当我们遇到 ‘1’,我们会启动DFS并沉没(通过将 ‘1’ 变为 ‘0’)与之相连的所有陆地,岛屿数量加1。在每一步中,我们考虑那些还没有被选择的数字,将一个数字添加到当前排列中,然后递归调用,直到所有数字都被选中。DFS可以在搜索过程中解决许多问题,当需要检查所有可能的解决方案时,DFS是一个理想的选择,常见于解决递归问题和回溯算法。给定一个没有重复数字的序列,返回其所有可能的全排列。

m0_73916791的博客 2830

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

dfs深度优先搜索_图的深度优先搜索(DFS)

dfs深度优先搜索Depth First Search (DFS) is an algorithm that searches a graph/tree, in a depth-wise manner. 深度优先搜索 ( DFS )是一种以深度方式搜索图/树的算法。 There are many ways through which we can traverse through a graph...

从零开始的教程世界 4352

深度优先搜索(DFS)总结

深度优先搜索(DFS)图的搜索算法深度优先搜索图示题例总结 图的搜索算法 深度优先搜索(又称DFS)是图的搜索算法的其中一种,另一种是广度优先搜索(BFS) 图的搜索算法可以看成是,从图的某一个点开始,通过遍历顶点和标记顶点来搜索图。 深度优先搜索 以迷宫问题为例,一个人被困在了迷宫里,为了走出迷宫,这个人需要访问迷宫的每一条路径和每一个十字路口(假设在最坏的情况下),那么怎么使得这个人记住他走...

Weleness的博客 5869

《啊哈算法》之DFS深度优先搜索

dfs模板 = 遍历 + 边界,源码与输入输出,隐式return,递归解析 掌握了模板,加上适量刷题,不同类型dfs都能找到思路就好

IT OR 考公? 2203

DFS(深度优先搜索)

DFS(Depth-First Search,深度优先搜索)是一种经典的图遍历算法,广泛应用于树结构遍历、图论问题(如连通性分析、拓扑排序)、路径搜索、回溯算法等领域。

KARRAS的博客 1897
上一篇: c++实现对结构体的快速排序
下一篇: 多线程基础架构 C++实现
breakpoints_
博客等级 码龄9年 52粉丝 28原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

breakpoints_

你的鼓励是我最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值