1.DFS简介
深度优先搜索(Depth First Search)一种用于遍历或搜索树或图的算法。 沿着树的深度遍历树的节点,尽可能深的搜索树的分支。当节点v的所在边都己被探寻过或者在搜寻时结点不满足条件,搜索将回溯到发现节点v的那条边的起始节点。整个进程反复进行直到所有节点都被访问为止。属于盲目搜索,最糟糕的情况算法时间复杂度为O(!n)。
ps:回溯法(探索与回溯法)是一种选优搜索法,又称为试探法,按选优条件向前搜索,以达到目标。但当探索到某一步时,发现原先选择并不优或达不到目标,就退回一步重新选择,这种走不通就退回再走的技术为回溯法,而满足回溯条件的某个状态的点称为“回溯点”。
2.算法讲解

深度优先搜索会走遍所有路径,并且每次走到死胡同缴代表条完整路径的形成。这就是说,深度优先搜索是一一种枚举所有完整路径以遍历所有情情况的搜索方法。
①从第一条路可以得到先后访问的结点为ABDH,此时H到达了死胡同,于是退回到D;再到I,但是I也是死胡同,再次退回到D;接着来到J,很不幸J还是死胡同,于是退回到D,但是此时D的岔路已经走完了,因此退回到上一个岔道口B。
②从B到达E,接下来又是三条岔路(K、L、M),依次进行枚举:前往K,发现K是死胡同,退回到E;前往L,发现L是死胡同,退回到E;前往M,发现M是死胡同,退回到E。最后因为E的岔路都访问完毕了,于是退回到B。但是B的所有岔路(D和E)也都访问完了,因此退回到A。
③访问A的另一个岔路可以到达C,而C仍然有两条岔路(F和G),于是先访问F,发现F是死胡同,退回到C;再访问G,发现是出口,DFS过程结束,整个DFS过程中先后访问结点的顺序为 ABDHIJEKLMCFG。

这个过程是不是和出栈入栈的过程很相似?第一步,ABD入栈,然后把D的三条路HIL先后入栈和出栈,再把D出栈; 第步和第三步执行与第一步类似的操作。由此可以知道如何去实现深度优先搜索:先对问题进行分析,到岔道口和死胡同:再定义一个栈,以深度为关键词访问这些岔道口和死胡同,并将它们入栈;而当离开这些岔道口和死胡同时,将它们出栈。
DFS可以使用栈来实现,也可以使用递归的方法,不过使用递归的时候系统会调用一个叫系统栈的东西存放递归中每一层的状态,因此使用递归来实现DFS的本质还是栈。
3.模板

void dfs(int num,......)//参数用来表示状态
{  if(判断边界)  {  ...//根据题意添加  return;  }  if(越界或者是不合法状态)  return;  for(扩展方式)  //也可能是if根据题意使用适合的方式{  if(扩展方式所达到状态合法)  {  修改操作;//根据题意来添加  标记;  dfs();  (还原标记);  //是否还原标记根据题意  //如果加上(还原标记)就是 回溯法  }  }
}

4.实例
题目:求出1-n的全排列
对照着模板看

#include<iostream>
using namespace std;int n;//1-n的全排列
const int maxn=10000;
int a[maxn];//当前的全排列
bool flag[maxn]={0};//记录是否已经在a数组里
void DFS(int index){if(index==n+1){for(int i=1;i<n;i++){cout<<a[i]<<" ";}cout<<a[n]<<endl;return;} for(int i=1;i<=n;i++){if(flag[i]==false){a[index]=i;flag[i]=true;DFS(index+1);flag[i]=false;}}
}
int main(){cin>>n; DFS(1);return 0;
}

5.参考书籍
《算法笔记》
6.其他题目
力扣的题
ps:其实早早的就看完了DFS,但是隔了很久才写这个。偷懒了很久,快十天没有学习了,真的不能这样啦,明天好好上课好好敲代码好好弄完美赛然后抛下一切备战考研。

[算法]DFS(深度优先搜索)C++相关推荐

  1. DFS(深度优先搜索)算法实现

    2 DFS算法 DFS(深度优先搜索)算法,搜索过程是类似于不撞南墙不回头的意思,DFS一般使用堆栈(先入后出)这种数据结构实现,由此一来,以初始起点为中心进行搜索,首先是周围点加入到堆栈中,起始点搜 ...

  2. 【蓝桥杯C/C++】专题五:DFS深度优先搜索

    专题五:DFS深度优先搜索 目录 专题五:DFS深度优先搜索 前言 什么是回溯法 如何理解回溯法 回溯法解决的问题 回溯法模板 1 .回溯函数模板返回值以及参数 2. 回溯函数终止条件 3 .回溯搜索 ...

  3. 【算法】蓝桥杯dfs深度优先搜索之排列组合总结

    [导航] 上一篇文章 → <[算法]蓝桥杯dfs深度优先搜索之凑算式总结>   为了重申感谢之意,再次声明下文的大部分灵感均来自于[CSDN]梅森上校<JAVA版本:DFS算法题解两 ...

  4. 【算法】蓝桥杯dfs深度优先搜索之图连通总结

    前言 上两篇文章 → <[算法]蓝桥杯dfs深度优先搜索之排列组合总结>      → <[算法]蓝桥杯dfs深度优先搜索之凑算式总结>   为了重申感谢之意,第三次声明下文的 ...

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

    dfs深度优先搜索 Depth First Search (DFS) is an algorithm that searches a graph/tree, in a depth-wise manne ...

  6. 【YBT高效进阶】1基础算法/4深度优先搜索/2数独游戏

    [YBT高效进阶]1基础算法/4深度优先搜索/2数独游戏 内存限制:256 MiB 时间限制:1000 ms 标准输入输出 题目类型:传统 评测方式:文本比较 题目描述 数独是一种传统益智游戏,你需要 ...

  7. “暴力美学1”——DFS深度优先搜索

    作为新时代青年,"暴力"二字似乎离我们十分遥远,大多数时候我们只能够在电影或者电视剧上接触这个概念 暴力二字或许是个贬义词,但若是我们在后面加上美学二字,或许就是一个值得推敲的词汇 ...

  8. 图:DFS(深度优先搜索)图解分析代码实现

    文章目录 一.简介 二.图的建立 2.1建立图类 2.2建立图 三.DFS 3.1图解 3.2代码 一.简介 图的DFS(深度优先搜索)与BFS(广度优先搜索)是图的两种遍历方式. 主要区别在于当到达 ...

  9. DFS——深度优先搜索基础

    [0]README 0.1) 本文总结于 数据结构与算法分析, 源代码均为原创, 旨在 review DFS--深度优先搜索 的基础知识: [1]深度优先搜索的应用 1.1)深度优先搜索算法描述(转自 ...

最新文章

  1. 2019数字化趋势:未来5年政府、零售数字化程度将达80%
  2. 第十五届全国大学生智能车安徽赛区参赛须知和竞赛日程安排
  3. Solr字段类型field type的定义
  4. 信用卡多还钱了怎么办?
  5. C++中的STL--结构概览
  6. java中sql语句怎么把开始和结束时间作为参数写sql查询_JDBC数据库连接怎么操作?...
  7. jstack 脚本 自动日志_深入理解jstack日志
  8. mysql基于ssl安全连接的主从复制
  9. 网络安全术语基础知识
  10. LinUX接收蓝牙音频,Win10 v2004已重新支持蓝牙A2DP音频串流接收功能
  11. 深蓝学院-多传感器融合定位-第4章作业
  12. amCharts 5.2.31 Crack
  13. w i ndows,解释计算 机Windows的学习英语(10页)-原创力文档
  14. 鼠标抖动问题(macbook下安装的win7系统)
  15. 酒店管理系统(C#和serverSql代码开发)
  16. 巴西龟饲养日志----冬眠记录
  17. 4K(不是价格)电视机选购指南
  18. visio studio code安装之后的两个错误的解决办法
  19. vscode中用快捷键 Alt + Shift + F 格式化代码不生效的问题
  20. Java 的反射机制

热门文章

  1. 质量人想获取领导赞赏,首先要划出漂亮的鱼骨图!
  2. javaweb编辑器ckeditor配置_ckeditor (一)在java web中的配置
  3. 工具软件价值分化,Adobe、万兴科技、猎豹移动们为何不同命?
  4. ajax自动加载blogjava和博客园的rss
  5. 【思维导图】计算机网络第四章网络层
  6. 邮件服务器zimbra的搭建与使用
  7. 总结一下这两天的学习笔记
  8. matlab中文论坛有手机版吗,MATLAB中文论坛常见问题归纳
  9. 如何用数学课件制作工具画角平分线
  10. 用js实现两数之和(哈希表)