DFS学习

摘要:
在重写问题的过程中,发现许多问题使用DFS(简称DFS),这是一种遍历或搜索树或图的算法。搜索将追溯到找到节点v的一侧的起始节点。此过程将继续,直到找到可从源节点访问的所有节点。然后选择其中一个作为源节点,并重复上述过程。整个过程重复进行,直到访问所有节点。沿着当前顶点的边走到尚未访问的顶点;上面的示例显示了DFS如何直观地解决搜索问题。

1、前言

    学习数据结构的时候就已经了解了DFS原理,但是一直没有详细的复习和代码实现。再刷题的过程中发现很多题目都使用DFS,因此回头再好好梳理一下DFS的思路以及代码实现。


2、算法理论

2.1 理论知识

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

深度优先遍历的主要思想就是:首先以一个未被访问过的顶点作为起始顶点,沿当前顶点的边走到未访问过的顶点;当没有未访问过的顶点时,则回到上一个顶点,继续试探访问别的顶点,直到所有的顶点都被访问。沿着某条路径遍历直到末端,然后回溯,再沿着另一条进行同样的遍历,直到所有的顶点都被访问过为止。

2.2 举例

求图中v0出发,到达v6长度为4的路径是否存在。

DFS学习第1张

DFS过程:

DFS学习第2张

DFS学习第3张

DFS学习第4张

。。。。。

DFS学习第5张

上例参考rapheal大神的例子,具体过程不详细展示了。上例展示了DFS如何直观的解决搜索问题。


3、算法实现

代码框架:

DFS(dep , ...){ //dep代表目前DFS深度
    if(找到解 || 走不下去了) //走不下去就是visited[dep] == 1了。
    {
        ...;
        return; 
    }
    DFS(dep+1, ...)  //枚举下一种情况
visited[dep] = 0 //回退时标记回退的节点为未被访问的节点
}

通常DFS要有一个visited数组,用来标识某个节点是否被访问过,但是也不是一定的。在走迷宫的题目中,就是用stack来标识。

感觉DFS一定要有递归的基础, DFS只处理当前的状态节点n,不关注下一个状态。

免责声明:文章转载自《DFS学习》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇高德室内地图解析vue项目使用static目录存放图片解决方案下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

DP_括号匹配序列问题

括号匹配问题 简单括号匹配问题是给出字符串,判断字符串中的括号是否匹配,此类问题核心解决方案就是利用栈的后进先出的特性,从左到右依次遍历字符串,遇左括号进栈,遇右括号将其与栈顶元素配对,若能配对,则栈顶元素出栈,继续遍历,若不能配对,则返回false。字符串遍历结束后,判断栈是否为空,若不为空返回false,若为空,返回true。以下有c和c++实现代码...

[转]mysql 存储过程中使用多游标

From : http://www.netingcn.com/mysql-procedure-muti-cursor.html mysql的存储过程可以很方便使用游标来实现一些功能,存储过程的写法大致如下: 先创建一张表,插入一些测试数据: DROP TABLE IF EXISTS netingcn_proc_test; CREATE TABLE `...

DSC搭建

目录 一、新建共享存储硬盘    1 1、准备两台虚拟机关机并新增共享存储硬盘    1 2、使用fdisk -l命令查看共享磁盘(root用户下)    2 二、DSC配置    3 1、在节点DSC0上划分共享磁盘上的裸设备    3 2、在两个节点上安装达梦数据库    5 3、在机器DSC0上准备dmdcr_cfg.ini配置文件    5 4、...

CentOS 6.0 图文安装教程

CentOS 6.0下载地址:wget http://ftp.riken.jp/Linux/centos/6.0/isos/i386/CentOS-6.0-i386-bin-DVD.iso 下边就是安装了:1、光盘引导界面,选择“Install or upgrade an existing system”。 其中图中的四个选项,应该都明白,我们这里选择的是...

Unity ShaderForge插件的使用

window--->Shader forge New Shader:新建一个Shader文件 Load Shader:导入已有的Shader文件 PolyCount thread:PolyCount页面 Unity:Unity Forum的页面,有问题可以去里面提问。 Node Documentation:Shader Forge中的节点说明文档...

MyCat 的入门和放弃

一、MyCat分库原理 1、非分片字段查询 Mycat中的路由结果是通过分片字段和分片方法来确定的。例如下图中的一个Mycat分库方案: 根据 tt_waybill 表的 id 字段来进行分片 分片方法为 id 值取 3 的模,根据模值确定在DB1,DB2,DB3中的某个分片 如果查询条件中有 id 字段的情况还好,查询将会落到某个具体的分片。例如:...