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

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

  例如,在下图中,我们从节点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,一经查实,立即删除!

相关文章

flex中dispatchEvent的用法(自定义事件) .

Evevt和EventDispatcher类在as3的事件机制中是很重要的角色&#xff0c;dispatchEvent()是EventDispatcher类的一个事件发送方法&#xff0c;它可以发送出Event类或其子类的实例&#xff0c;在as3中所有的显示对象都可以发送事件&#xff0c;因为as3中所有的显示对象都是EventD…

菜鸟超级进口大仓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;只…

android更换工具链

欢迎转载opendevkit文章, 文章原始地址: http://www.opendevkit.com/?e73 android编译系统是跟随android源码一起发布的&#xff0c;使用了gcc编译器&#xff0c;也就是所谓的交叉编译环境。android-4.2里用的编译器是gcc4.6&#xff0c;本篇升级gcc4.6到gcc4.6&#xff0c;修…

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

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

Java系列(1) JavaEE架构

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

协整检验r语言代码_R语言时间序列分析实例

#加载数据xread.table(file.choose())#生成时间序列对象xtimeseries#画时间序列图plot.ts(xtimeseries)#增加线性拟合曲线abline(lm(xtimeseries~time(xtimeseries)))1、分解时间序列分解一个时间序列意味着把它拆分成构成元件&#xff0c;一般序列包含一个趋势部分、一个不规则…

pat1043. Is It a Binary Search Tree (25)

1043. Is It a Binary Search Tree (25) 时间限制400 ms内存限制65536 kB代码长度限制16000 B判题程序Standard作者CHEN, YueA Binary Search Tree (BST) is recursively defined as a binary tree which has the following properties: The left subtree of a node contains o…

微软待办应用更新

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

出租WiFi到底靠不靠谱?

创业是一种心态&#xff0c;也是不断的探索&#xff0c;他融入我们的生活&#xff0c;从日常中积累&#xff0c;从小微处启航。 一、背景交代 最近在换工作&#xff0c;本周搬到新租的单身公寓&#xff0c;空间不大&#xff0c;倒是干净整洁。委托租房中介帮忙开通宽带&#xf…

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…

在vue中实现picker样式_基于Vue实现timepicker

主要用到的还是Vue的基本知识而已&#xff0c;不过要想到的细节很多。先放效果&#xff0c;点击上框&#xff0c;显示timepicker。而且可以根据点击的是时还是分来改变圆盘的数字。这里我用了两个组件&#xff0c;和&#xff0c;这里的时和分的数值我挂在了根实例中&#xff0c…

玩玩

金字塔一样输出字母&#xff0c;如 输入 d a a b a a b c b a a b c d c b a 代码实现 #include<stdio.h> int main(void) { char z; int j,t,k; scanf("%c",&z); t0; if(z>a&&z<z) { for(int i0;i<z-a;i) { for(kz-a-t;k…

总结界面框架_UI_Adapter

本人定期更新经典案例及解决方案如有疑问请联系我QQ1822282728 -- 277627117 下面是常用到的ui Demo安卓三级筛选菜单listview&#xff08;非常经典&#xff09; http://download.csdn.net/detail/zillvip/9138975android地图应用&#xff08;路径规划&#xff0c;地理编码&…

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

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

git如何设置master分支的权限_Git 从master 分支拉新分支开发

一、 切换到被copy的分支(master)&#xff0c;并且从远端拉取最新版本$git checkout master$git pull二、从当前分支拉copy开发分支$git checkout -b devSwitched to a new branch dev三、 把新建的分支push到远端$git push origin dev四、拉取远端分支$git pullThere is no tr…

Yii框架 phpexcel 导出

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