深度优先搜索使用的策略是,只要与可能就在图中尽量“深入”。DFS总是对最近才发现的结点v出发边进行探索,知道该结点的所有出发边都被发现为止。一旦v的所有出发边都被发现了,搜索就回溯到v的前驱结点(v是经该结点才被发现的),来搜索该前驱结点的出发边。该过程持续知道从源结点可以到达的所有结点都被发现为止。此后若还存在未被发现的结点,则DFS将从从未被发现的结点中任选一个结点作为新的源节点,并重复同样的过程。

  还是老办法,上代码,可以清楚地解释:

 1 #include <iostream>
 2 #include <list>
 3 using namespace std;
 4
 5 class Graph{
 6 private:
 7     int v;//结点数
 8     list<int>* adj;//结点临接链表
 9     void DFSUtil(int u,bool visited[]);
10 public:
11     Graph(int v);
12     void addEdge(int start,int end);
13     void DFS();
14 };
15
16 Graph::Graph(int v){
17     this->v = v;
18     adj = new list<int>[v];
19 }
20
21 //无向图
22 void Graph::addEdge(int start,int end){
23     adj[start].push_back(end);
24     adj[end].push_back(start);
25 }
26
27 void Graph::DFSUtil(int u,bool visited[]){
28     visited[u] = true;
29     cout<<u<<" ";
30     list<int>::iterator beg = adj[u].begin();
31     for (;beg != adj[u].end();++beg){
32         if (visited[*beg] == false)
33             DFSUtil(*beg,visited);
34     }
35 }
36
37 void Graph::DFS(){
38     bool* visited = new bool[v];
39     for (int i=0;i<v;i++)
40         visited[i] = false;
41     //递归调用dfsutil函数深度遍历每个结点
42     for (int i=0;i<v;i++)
43         if (visited[i] == false)
44             DFSUtil(i,visited);
45     cout<<endl;
46 }
47
48 int main()
49 {
50     Graph g = Graph(8);
51     g.addEdge(0,1);
52     g.addEdge(0,2);
53     g.addEdge(0,5);
54     g.addEdge(1,3);
55     g.addEdge(2,3);
56     g.addEdge(2,4);
57     g.addEdge(2,5);
58     g.addEdge(4,5);
59     g.addEdge(6,7);
60     g.DFS();
61
62     return 0;
63 }

需要指出的是,本例使用的是无向图,但DFS也可以针对有向图。

需要加以说明的是,即使该图中有结点无法保证能到达图中所有结点,但代码中第42行可以保证图中每个结点都会被访问到。

运行结果如下:

文献引用:算法导论->22章->基本图算法

代码参考:http://www.geeksforgeeks.org/depth-first-traversal-for-a-graph/

转载于:https://www.cnblogs.com/lxiao/p/4320601.html

算法系列之图--DFS相关推荐

  1. [算法系列] 深入递归本质+经典例题解析——如何逐步生成, 以此类推,步步为营

    [算法系列] 深入递归本质+经典例题解析--如何逐步生成, 以此类推,步步为营 本文是递归系列的第三篇, 第一篇介绍了递归的形式以及递归设计方法(迭代改递归),;第二篇以递归为引子, 详细介绍了快排和 ...

  2. Java实现算法导论中图的广度优先搜索(BFS)和深度优先搜索(DFS)

    对算法导论中图的广度优先搜索(BFS)和深度优先搜索(DFS)用Java实现其中的伪代码算法,案例也采用算法导论中的图. import java.util.ArrayList; import java ...

  3. 八十五、Python | Leetcode数据结构之图和动态规划算法系列

    @Author:Runsen @Date:2020/7/7 人生最重要的不是所站的位置,而是内心所朝的方向.只要我在每篇博文中写得自己体会,修炼身心:在每天的不断重复学习中,耐住寂寞,练就真功,不畏艰 ...

  4. dijkstra算法_Python实现图的经典DFS、BFS、Dijkstra、Floyd、Prim、Kruskal算法

    讲在前面的话,图的算法太多,理论知识肯定一篇文章讲不完,关于理论知识大家可以参考教材Sedgewick的<算法>或reference的链接,本文主要还是想在一篇文章中记录六种算法的Pyth ...

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

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

  6. 啊哈算法系列(C语言、python、Java )

    关于<啊哈!算法>相关资源 关于<啊哈!算法>相关资源 - 欣乐 - 博客园 第1章 一大波数正在靠近--排序 第1节 最快最简单的排序--桶排序 [坐在马桶上看算法]算法1: ...

  7. 导师计划--数据结构和算法系列(上)

    导师计划已经开始一个月了,自己的讲解的课程选择了数据结构和算法.这个系列的讲解分为上下两章,javascript语言辅助.本篇文章为上章,涉及的内容是基本的数据结构.在日本,晚上没事安排@-@,时间还 ...

  8. 导师计划 -- 数据结构和算法系列(上)

    导师计划已经开始一个月了,自己的讲解的课程选择了数据结构和算法.这个系列的讲解分为上下两章,javascript语言辅助.本篇文章为上章,涉及的内容是基本的数据结构.在日本,晚上没事安排@-@,时间还 ...

  9. 图论算法(5):图的广度优先遍历 BFS

    本章节内容使用 java 实现,Github 代码仓:https://github.com/ZhekaiLi/Code/tree/main/Graph/src 查看文章内的图片可能需要科学上网! 因为 ...

最新文章

  1. linux环境编程-- ftok()函数
  2. zabbix监控windows(03,08)
  3. 后端用python还是php_【后端开发】2019学python还是php
  4. jquery上传图片_文件上传三种方式
  5. MySQL集群:高可用性DBMS
  6. 2017.7.19 Race 思考记录
  7. waring Release版本
  8. canvas学习(四):高级属性
  9. 用sysprep制作可以导入MDT的镜像
  10. Cannot open include file: 'unistd.h': No such file or directory的解决办法
  11. 在linux内核中修改TCP MSS值
  12. dcs world f15c教学_开源声码器WORLD在语音合成中的应用
  13. UOS 下wine的记录
  14. 无线网Wifi和WLAN的区别
  15. vmware虚拟机centos7扩容
  16. U3V实现——CYUSB3014之GPIF总结
  17. 性价比哪家强?富勒G93S光磁微动鼠标深度评测
  18. 法外之徒第一季/全集Braquo迅雷下载
  19. 【Python】浅谈 字节码 + 虚拟机 (Python 解释器)
  20. P3088 [USACO13NOV]CROWDED COWS S

热门文章

  1. centos7重装python_CentOS7重装yum和python
  2. oracle 存储过程打印语句,oracle学习之第一个存储过程:打印Hello World
  3. 计算机考研百天,2015考研计算机专业复习百天周计划
  4. 计算机管理员受限用户,如何设置权限,使管理员能上网,而受限用户却不能上网?...
  5. keepalived mysql双主架构图_基于MySQL双主的高可用解决方案理论及实践
  6. linux ntp时间立即同步命令_记一次生产环境部署NTP服务及配置时间同步
  7. python中以表示语块_scikitlearn:将数据拟合成块与将其全部拟合到on
  8. springboot Autowired BeanNotOfRequiredTypeException
  9. springmvc+jpa实现分页的两种方式
  10. 平衡二叉树AVL删除