c语言 dfs,DFS(深度优先搜索)
1. DFS简介
深度优先搜索算法(英语:Depth-First-Search,简称DFS)是一种用于遍历或搜索树或图的算法。 沿着树的深度遍历树的节点,尽可能深的搜索树的分支。当节点v的所在边都己被探寻过或者在搜寻时结点不满足条件,搜索将回溯到发现节点v的那条边的起始节点。整个进程反复进行直到所有节点都被访问为止。属于盲目搜索,最糟糕的情况算法时间复杂度为O(!n),DFS搜索的过程访问可以称之为DFS序。
如图:
对于一颗这样的树,我们的DFS序可以为:abdefc(即时对于同一颗的树,其DFS序不一定唯一),即访问a之后访问a的子结点b,再在b的基础上依次访问它的子结点def,最后回退到a处访问c。
这与前文花大篇幅介绍的先序,中序,后续遍历如出一辙,唯一的不同就是这样的一棵树并不只存在有左右两个结点,它可以是多枝的。
而即时对于一颗深度为n的二树,在没有任何优化的情况下适用DFS去搜索访问数据,其算法的时间复杂度也高达O(2^n),在数据较大的情况下DFS是无法满足程序的时间要求,这就会涉及到一个思路——剪枝,即通过现有的数据判断接下来的数据无法再满足解,直接将当前结点以后的所有数据舍弃,遍历不再访问,通过精心设计的剪纸可以使得DFS搜索的效果得到很大提升。
2. 模板:
对于一个标准的DFS模板而言,其包括了以下的内容:bool check(参数)
{
if(满足条件)
return true ;
return false;
}
void dfs(int step)
{
判断边界
{
相应操作
}
尝试每一种可能
{
满足check条件
标记
继续下一步dfs(step+1)
恢复初始状态(回溯的时候要用到)
}
}
3. 相关习题
三角形(注,其还涉及了一点动态规划的思维):
c语言 dfs,DFS(深度优先搜索)相关推荐
- 蓝桥杯笔记:DFS(深度优先搜索)解决问题
DFS: 深度优先搜索: 访问当前的元素后,递归访问元素的邻接元素(找出所有下一步的可能元素,判断是否能访问),撤回当前元素访问 dfs(当前状态) {//递归终止条件if(当前状态==结束状态) { ...
- 优先深度搜索判断曲线相交_程序员必知的十大基础实用算法之-DFS(深度优先搜索)...
深度优先搜索 深度优先搜索是一种在开发爬虫早期使用较多的方法.它的目的是要达到被搜索结构的叶结点(即那些不包含任何超链的HTML文件) .在一个HTML文件中,当一个超链被选择后,被链接的HTML文件 ...
- DFS(深度优先搜索)详解(概念讲解,图片辅助,例题解释,剪枝技巧)
目录 那年深夏 引入 1.什么是深度优先搜索(DFS)? 2.什么是栈? 3.什么是递归? 图解过程 问题示例 1.全排列问题 2.迷宫问题 3.棋盘问题(N皇后) 4.加法分解 模板 剪枝 1.简介 ...
- 搜索与回溯算法:DFS(深度优先搜索)
深度优先搜索:1.确定回溯终止条件2.重复生成其他可能 今天开始改用JavaScript 我的LeetCode题解: 力扣,剑指 Offer 12. 矩阵中的路径 力扣,剑指 Offer 13. 机器 ...
- 深度优先搜索c语言详解,深度优先搜索 — C语言版
思路:找一个入口结点,然后搜索该结点的第一个相邻结点,再搜索该相邻结点的第一个相邻结点,依次往下寻找 - - ,直到所有结点都被遍历到,算法结束,退出. #include #define MAX 10 ...
- 类孔明棋 c语言实验,深度优先搜索中的重叠子结果的优化问题
前几天帮朋友写一个类孔明棋的算法, 上题 5*5的棋盘 .表示没棋子 o表示有棋子 如: ooooo ooooo oo.oo ooooo ooooo 走法和孔明的走法一样 开始直接 ...
- C语言递归实现深度优先搜索DFS算法(附完整源码)
C语言递归实现DFS算法 完整Graph.h 头文件 完整Graph.c 源文件文件 完整dfs_recursive.c 源文件(main测试函数) 完整Graph.h 头文件 #include &l ...
- DFS【深度优先搜索】的一个小小代码—破解QQ一笔画
很久之前我在数学建模晚自习时,我后面的人问问能不能把一个一笔画红包解开,我看了一下他手机的屏幕,密密麻麻的线条,一看就是为难人类,但是我想了想,这貌似可以用DFS来解,于是我就开始写,然后就有了这个文 ...
- DFS(深度优先搜索)---迷宫(洛谷)----SCAU_LEO
一.题目 题目链接:迷宫 首先,今天是1月2日,虽然有点晚了,但是还是祝大家新的一年快快乐乐,开开心心,题题AC,场场拿金,! 说说我对迷宫类题目的感受,我记得刚开始学迷宫的时候,不是看的很懂,但是睡 ...
最新文章
- python 删除list 里面的一个空集合
- 2016.01.04 论文改重
- portlet 与 servlet 的关系
- 第三次scrum冲刺
- ESP8266:(2)获取时间和天气
- SpringBoot 集成 Jsp、Thymeleaf 模板引擎 + Thymeleaf 基本使用
- 操作系统 第三章 内存管理
- 利用 HttpModule,基于输出,统一控制、干预、处理(例如: 过滤关键字、AntiXSS) ASP.Net WebForm Control 展现属性的方案原型...
- K8S学习--Kubeadm-3-dashboard部署和升级
- 百度地图,根据地址计算经度纬度
- win7安装VScode(Visual Studio Code)
- php 音频转换 WAV转MP3
- 买卖股票的最佳时机 II Java (贪心算法)
- plsql如何导入csv文件,PLSQL导入csv文件到数据库
- 淘宝心选在大润发开店了,背后意味着什么?
- DialogFragment以及AlertDialogFragment
- 为年会写的配乐诗朗诵稿
- CSDN日报190318:简单爬虫:给女友定时发送睡前小故事
- HackTheBox-baby CachedView
- 解决 Android resource linking failed, error: failed linking references.