【数据结构】图的深度优先搜索

  图的深度优先搜索类似于树的深度优先搜索。不同的是,图中可能包括循环,即我们有可能重复访问节点。为了避免访问已经访问过的节点,我们要使用一个布尔变量的数组。

  例如,在下图中,我们从节点2开始访问。当访问到节点0,我们寻找它的所有紧接节点。节点2也属于节点0的邻接节点。如果我们没有标记访问的节点,那么节点2 将会被重复访问,这样的话整个算法过程就不会停下来了。下图的深度优先搜索是2,0,1,3

  这种搜索算法所遵循的搜索策略是尽可能“深”地搜索一个图。它的基本思想如下:首先访问图中某一起始顶点v,然后由v出发,访问与v邻接且未被访问的任一顶点w1,再访问与w1邻接且未被访问的任一顶点w2,......重复上述过程。当不能再继续向下访问时,一次退回到最近被访问的顶点,若它还有邻接顶点未被访问过,则从该点开始继续上述搜索过程,直到图中所有顶点均被访问过为止。

  举个例子:

  

  上图一幅无向图。我们从A点开始遍历,并假设左边的节点先被访问到。那么访问顺序是A,搜索A所有可访问的邻接节点并选择B,然后访问B,搜索B所有可访问的邻接节点并选择D,然后访问D,搜索D的所有可访问的邻接节点。由于D只有一个邻接节点B,而B已经被访问过。所以回退到D的上级B(注意,不是访问B,仅仅是回到上级)。然后再搜索B的所有可访问的邻接节点,AD已经被访问过,所以访问F。这个过程一直持续直到访问过所有的节点。

  选择可访问邻接节点的时候,可以使用我们自己定义的顺序。比如访问A的邻接节点的时候,可以先访问B,也可以先访问E。可根据需求灵活调整。

 

下述代码是深度优先搜索的C++版本,有递归和迭代版本。图的实现使用邻接链表表示。STL的list被用来存储邻接节点。

#include<list>
#include<iostream>
using namespace std;class Graph {private:int V;list<int>* adj;void DfsUtil(int v, bool visited[]);public:Graph(int n);    //No of vertices~Graph();    //Pointer to an array containing adjacency listsvoid addEdge(int v, int w);    //function to add an edge to graphvoid Dfs(int s);    //Dfs traversal of the vertices reachable from vvoid DfsIter(int s);
};Graph::Graph(int v) {V = v;adj = new list<int>[V];
}Graph::~Graph() {delete []adj;adj = NULL;
}void Graph::addEdge(int v, int w) {adj[v].push_back(w);    //Add w to v's list
}void Graph::Dfs(int s) {bool* visited = new bool[V];for (int i = 0; i < V; i++)visited[V] = false;DfsUtil(s, visited);
}void Graph::DfsUtil(int v, bool visited[]) {//Mark the current node as the visited and print itvisited[v] = true;cout<<v<<" ";//Recur for all vertices adjacent to this vertexlist<int>::iterator i;for (i = adj[v].begin(); i != adj[v].end(); i++)if (!visited[*i])DfsUtil(*i, visited);
}void Graph::DfsIter(int v) {bool*  visited = new bool[V];for (int i = 0; i < V; i++)visited[i] = false;list<int> stack;stack.push_back(v);list<int>::iterator i;while (!stack.empty()) {v = stack.back();cout<<v<<" ";stack.pop_back();visited[v] = true;for(i = adj[v].begin(); i != adj[v].end(); i++)if (!visited[*i])stack.push_back(*i);} delete []visited;
}int main()
{// Create a graph given in the above diagramGraph g(4);g.addEdge(0, 1);g.addEdge(0, 2);g.addEdge(1, 2);g.addEdge(2, 0);g.addEdge(2, 3);g.addEdge(3, 3);cout << "Following is Depth First Traversal (starting from vertex 2) \n";g.DfsIter(2);return 0;
}

 

输出:

Following is Depth First Traversal (starting from vertex 2)
2 0 1 3

 

参考资料:

  1. http://www.geeksforgeeks.org/depth-first-traversal-for-a-graph/

转载于:https://www.cnblogs.com/vincently/p/4769617.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/258418.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

菜鸟超级进口大仓618首度亮相!跨境商品也能当日次日达

6月12日下午3点40分&#xff0c;来自南京的一名用户收到了由宁波保税仓发出、圆通速递配送的雀巢咖啡&#xff0c;这距离他在天猫国际上下单仅过去4小时。 天猫618在昨日迎来进口日&#xff0c;进口销量火爆上升。作为国内最为先进的跨境进口仓&#xff0c;菜鸟超级大仓在本次大…

频域/s域/z域三大变换的发展史及其联系

本文主要介绍三大变换&#xff08;傅里叶变换、拉普拉斯变换及Z变换&#xff09;的发展史及其之间的联系。

Tomcat8.0.21登录时忘记用户名和密码

大概是这学期开学没多久吧&#xff0c;4月份的时候&#xff0c;为了学习javaEE&#xff0c;装了Tomcat。过了这么久早就忘记用户名和密码了&#xff0c;所以无法进入Tomcat的管理界面。百度&#xff08;其实我也很想用google&#xff09;了一堆&#xff0c;几乎都是修改用户配置…

二元隐函数求二阶偏导_在线计算专题(03):具体、抽象函数的导数、微分与方向导数的计算...

导数与微分是微积分内容的基础&#xff0c;就计算来说一元函数与多元函数的导数的计算思想一致. 不管是一元函数还是多元函数&#xff0c;导数、偏导数的计算都是将函数视为求导变量的一元函数求导数。微分在描述形式略有区别&#xff0c;但是其计算方法还是一样&#xff0c;只…

频域/s域/z域三大变换的性质对比

本文主要介绍三大变换&#xff08;傅里叶变换、拉普拉斯变换及Z变换&#xff09;的性质对比及其常用信号变换。

Java系列(1) JavaEE架构

JavaEE是开发分布式应用的工业标准&#xff0c;Weblogic,BES,Tomcat等是比较常见的JavaEE服务器&#xff0c;严格来说Tomcat没有实现全部的JavaEE规范&#xff0c;只能算是Servlet容器。我们从一幅Spec文档上的架构图,粗略了解JavaEE的基本结构。该结构图表达了JavaEE各元素的逻…

微软待办应用更新

微软做了一些更改和优化来改进微软待办。 为了在所有设备上获得最佳体验&#xff0c;需确保移动和桌面微软待办2021 年 12 月 31日之前的版本为 2.49 或更高版本&#xff0c;否则微软待办不再支持跨设备同步&#xff0c;但仍然能脱机使用。 桌面版的微软待办应用下载地址为&…

AD20学习笔记1---元件库的创建

前言&#xff1a; 本文学习视频是B站点击率第一的凡亿教育《Altium Designer 20 19&#xff08;入门到精通全38集&#xff09;四层板智能车PCB设计视频教程》&#xff0c;视频地址&#xff1a;Altium Designer 20 19&#xff08;入门到精通全38集&#xff09;四层板智能车PCB设…

nodejs环境搭建与express安装配置

一、NPM 1、下载nodeJS 下载地址&#xff1a;https://nodejs.org/en/download/ 因为我的系统是Linux 的&#xff0c;所以下载已经编译好的Linux&#xff0c;nodejs tar包 3、下载完成过后放到/usr/local/下面 4、解压&#xff1a;因为这个包不是gz的包所以解压 正确&#xff1a…

AD20学习笔记2---原理图绘制及编译检查

前言&#xff1a; 本文学习视频是B站点击率第一的凡亿教育《Altium Designer 20 19&#xff08;入门到精通全38集&#xff09;四层板智能车PCB设计视频教程》&#xff0c;视频地址&#xff1a;Altium Designer 20 19&#xff08;入门到精通全38集&#xff09;四层板智能车PCB设…

Yii框架 phpexcel 导出

一、说明 之前使用的是PHPExcelXML包实现的数据导出&#xff0c;由于导出的文件扩展名为“.xls” 在office2007上带不开&#xff0c;报如下图错误&#xff08;用 WPS都能打开&#xff09; 因此&#xff0c;此次采用了 PHPExcel包 不仅支持生成Excel&#xff08;.xls&#xff09…

AD20学习笔记3---PCB封装库的创建方法及现有封装调用

前言&#xff1a; 本文学习视频是B站点击率第一的凡亿教育《Altium Designer 20 19&#xff08;入门到精通全38集&#xff09;四层板智能车PCB设计视频教程》&#xff0c;视频地址&#xff1a;Altium Designer 20 19&#xff08;入门到精通全38集&#xff09;四层板智能车PCB设…

Python守护进程和脚本单例运行

2019独角兽企业重金招聘Python工程师标准>>> 一、简介 守护进程最重要的特性是后台运行&#xff1b;它必须与其运行前的环境隔离开来&#xff0c;这些环境包括未关闭的文件描述符、控制终端、会话和进程组、工作目录以及文件创建掩码等&#xff1b;它可以在系统启动…

AD20学习笔记4---网表导入及模块化布局设计

前言&#xff1a; 本文学习视频是B站点击率第一的凡亿教育《Altium Designer 20 19&#xff08;入门到精通全38集&#xff09;四层板智能车PCB设计视频教程》&#xff0c;视频地址&#xff1a;Altium Designer 20 19&#xff08;入门到精通全38集&#xff09;四层板智能车PCB设…

javascript 模块化

2019独角兽企业重金招聘Python工程师标准>>> 一直好奇像node.js,require.js的模块化是怎么做的&#xff0c;在看了《你不知道的javascript》后&#xff0c;对js的模块化有了一些简单的了解。这本书真的还不错。 书里讲述了js的模块化的原理 和 现代js实现模块化的简…

AD20学习笔记5---PCB设计规则设置及PCB手工布线

前言&#xff1a; 本文学习视频是B站点击率第一的凡亿教育《Altium Designer 20 19&#xff08;入门到精通全38集&#xff09;四层板智能车PCB设计视频教程》&#xff0c;视频地址&#xff1a;Altium Designer 20 19&#xff08;入门到精通全38集&#xff09;四层板智能车PCB设…

理论物理极础9:相空间流体和吉布斯-刘维尔定理

莱尼喜欢看河&#xff0c;尤其喜欢看漂浮物顺流而下。他猜想漂浮物如何穿过礁石&#xff0c;如何陷入漩涡。但是河流整体&#xff0c;水量&#xff0c;流切变&#xff0c;河的分流和汇聚&#xff0c;这是莱尼所看不到的。 相空间流体 在经典力学里&#xff0c;注视一个特别的初…

nginx没有worker进程_如何优雅地关闭worker进程?

点击上方“武培轩”&#xff0c;选择“设为星标”技术文章第一时间送达&#xff01;之前我们讲解 Nginx 命令行的时候&#xff0c;可以看到 Nginx 停止有两种方式&#xff0c;分别是 nginx -s quit 和 nginx -s stop&#xff0c;其中 stop 是指立即停止 Nginx&#xff0c;而 qu…

RC电路输出波形的时域与频域分析

RC一阶电路为例进行时域和频域分析&#xff0c;激励Us为方波&#xff0c;以Uc作为输出的波形相当于积分电路的输出曲线&#xff0c;以Ur作为输出的波形相当于微分电路的输出曲线。电容对输入电压具有平滑作用&#xff0c;平滑程度与时间常数有关&#xff0c;衰减程度与带宽设计…

多麦克风做拾音的波束_麦克风阵列是什么 有哪些关键技术?

麦克风阵列是什么 有哪些关键技术&#xff1f;亚马逊Echo和谷歌Home争奇斗艳&#xff0c;除了云端服务&#xff0c;他们在硬件上到底有哪些差异&#xff1f;我们先将Echo和Home两款音箱拆开来看&#xff0c;区别最大的还是麦克风阵列技术。Amazon Echo采用的是环形61麦克风阵列…