算法系列之图--DFS
深度优先搜索使用的策略是,只要与可能就在图中尽量“深入”。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相关推荐
- [算法系列] 深入递归本质+经典例题解析——如何逐步生成, 以此类推,步步为营
[算法系列] 深入递归本质+经典例题解析--如何逐步生成, 以此类推,步步为营 本文是递归系列的第三篇, 第一篇介绍了递归的形式以及递归设计方法(迭代改递归),;第二篇以递归为引子, 详细介绍了快排和 ...
- Java实现算法导论中图的广度优先搜索(BFS)和深度优先搜索(DFS)
对算法导论中图的广度优先搜索(BFS)和深度优先搜索(DFS)用Java实现其中的伪代码算法,案例也采用算法导论中的图. import java.util.ArrayList; import java ...
- 八十五、Python | Leetcode数据结构之图和动态规划算法系列
@Author:Runsen @Date:2020/7/7 人生最重要的不是所站的位置,而是内心所朝的方向.只要我在每篇博文中写得自己体会,修炼身心:在每天的不断重复学习中,耐住寂寞,练就真功,不畏艰 ...
- dijkstra算法_Python实现图的经典DFS、BFS、Dijkstra、Floyd、Prim、Kruskal算法
讲在前面的话,图的算法太多,理论知识肯定一篇文章讲不完,关于理论知识大家可以参考教材Sedgewick的<算法>或reference的链接,本文主要还是想在一篇文章中记录六种算法的Pyth ...
- 【算法】蓝桥杯dfs深度优先搜索之图连通总结
前言 上两篇文章 → <[算法]蓝桥杯dfs深度优先搜索之排列组合总结> → <[算法]蓝桥杯dfs深度优先搜索之凑算式总结> 为了重申感谢之意,第三次声明下文的 ...
- 啊哈算法系列(C语言、python、Java )
关于<啊哈!算法>相关资源 关于<啊哈!算法>相关资源 - 欣乐 - 博客园 第1章 一大波数正在靠近--排序 第1节 最快最简单的排序--桶排序 [坐在马桶上看算法]算法1: ...
- 导师计划--数据结构和算法系列(上)
导师计划已经开始一个月了,自己的讲解的课程选择了数据结构和算法.这个系列的讲解分为上下两章,javascript语言辅助.本篇文章为上章,涉及的内容是基本的数据结构.在日本,晚上没事安排@-@,时间还 ...
- 导师计划 -- 数据结构和算法系列(上)
导师计划已经开始一个月了,自己的讲解的课程选择了数据结构和算法.这个系列的讲解分为上下两章,javascript语言辅助.本篇文章为上章,涉及的内容是基本的数据结构.在日本,晚上没事安排@-@,时间还 ...
- 图论算法(5):图的广度优先遍历 BFS
本章节内容使用 java 实现,Github 代码仓:https://github.com/ZhekaiLi/Code/tree/main/Graph/src 查看文章内的图片可能需要科学上网! 因为 ...
最新文章
- linux环境编程-- ftok()函数
- zabbix监控windows(03,08)
- 后端用python还是php_【后端开发】2019学python还是php
- jquery上传图片_文件上传三种方式
- MySQL集群:高可用性DBMS
- 2017.7.19 Race 思考记录
- waring Release版本
- canvas学习(四):高级属性
- 用sysprep制作可以导入MDT的镜像
- Cannot open include file: 'unistd.h': No such file or directory的解决办法
- 在linux内核中修改TCP MSS值
- dcs world f15c教学_开源声码器WORLD在语音合成中的应用
- UOS 下wine的记录
- 无线网Wifi和WLAN的区别
- vmware虚拟机centos7扩容
- U3V实现——CYUSB3014之GPIF总结
- 性价比哪家强?富勒G93S光磁微动鼠标深度评测
- 法外之徒第一季/全集Braquo迅雷下载
- 【Python】浅谈 字节码 + 虚拟机 (Python 解释器)
- P3088 [USACO13NOV]CROWDED COWS S
热门文章
- centos7重装python_CentOS7重装yum和python
- oracle 存储过程打印语句,oracle学习之第一个存储过程:打印Hello World
- 计算机考研百天,2015考研计算机专业复习百天周计划
- 计算机管理员受限用户,如何设置权限,使管理员能上网,而受限用户却不能上网?...
- keepalived mysql双主架构图_基于MySQL双主的高可用解决方案理论及实践
- linux ntp时间立即同步命令_记一次生产环境部署NTP服务及配置时间同步
- python中以表示语块_scikitlearn:将数据拟合成块与将其全部拟合到on
- springboot Autowired BeanNotOfRequiredTypeException
- springmvc+jpa实现分页的两种方式
- 平衡二叉树AVL删除