算法系列之图--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

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

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

相关文章

python列表中随机选择_如何在Python中从列表中随机选择一个项目?

python列表中随机选择Python random module provides an inbuilt method choice() has an ability to select a random item from the list and other sequences. Using the choice() method, either a single random item can be chosen or multiple items. The below set of …

这8种常见的SQL错误用法,你还在用吗?

来源 | yq.aliyun.com/articles/72501MySQL 在近几年仍然保持强劲的数据库流行度增长趋势。越来越多的客户将自己的应用建立在 MySQL 数据库之上&#xff0c;甚至是从 Oracle 迁移到 MySQL上来。但也存在部分客户在使用 MySQL 数据库的过程中遇到一些比如响应时间慢&#xff0c…

微软披露了Spartan中所使用的渲染引擎的细节

微软披露了在Spartan web浏览器中所使用的新渲染引擎的更多信息&#xff0c;Windows 10的桌面版本和移动设备版本将预装该浏览器。\\Charles Morris是Spartan项目的项目经理主管&#xff0c;他在一篇博客帖子中详细地解释了该项目背后的成因、IE浏览器的历史以及未来的计划。该…

常见疑惑问题

常见疑惑问题maven是什么maven是什么 maven——用于导入jar包的快捷方法

c++ array stl_C ++ STL中带有示例的array :: front()函数

c array stlC STL array :: front()函数 (C STL array::front() function) font() function is a library function of array and it is used to get the first element of an array, it returns the reference to the first element in an array. font()函数是array的库函数&…

千万不要这样写代码!9种常见的OOM场景演示

《Java虚拟机规范》里规定除了程序计数器外&#xff0c;虚拟机内存的其他几个运行时区域都有发生 OutOfMemoryError 异常的可能&#xff0c;我们本文就来演示一下这些错误的使用场景。一. StackOverflowError1.1 写个 bugpublic class StackOverflowErrorDemo {public static v…

Android开发教程:手机震动控制浅析

Android系统中Vibrator对象负责对手机震动的处理&#xff0c;具体的实现方法&#xff1a; 1.获取振动器Vibrator的实例&#xff1a; Vibrator vibrator (Vibrator) getSystemService(VIBRATOR_SERVICE); getSystemService(VIBRATOR_SERVICE)&#xff1a;获得 一个震动的服务2.…

MySQL数据库安装与配置详解

目录 一、概述 二、MySQL安装 三、安装成功验证 四、NavicatforMySQL下载及使用 一、概述 MySQL版本&#xff1a;5.7.17 下载地址&#xff1a;http://rj.baidu.com/soft/detail/12585.html?ald 客户端工具&#xff1a;NavicatforMySQL 绿色版下载地址&#xff1a;http://www.c…

java 根据类名示例化类_Java LocalDateTime类| 带示例的getNano()方法

java 根据类名示例化类LocalDateTime类getNano()方法 (LocalDateTime Class getNano() method) getNano() method is available in java.time package. getNano()方法在java.time包中可用。 getNano() method is used to get nano-of-second field value from this date-time o…

求求你,不要再使用!=null判空了!

对于Java程序员来说&#xff0c;null是令人头痛的东西。时常会受到空指针异常&#xff08;NPE&#xff09;的骚扰。连Java的发明者都承认这是他的一项巨大失误。那么&#xff0c;有什么办法可以避免在代码中写大量的判空语句呢&#xff1f;有人说可以使用 JDK8提供的 Optional …

Linux系统的基本法则

Linux基本法则&#xff1a;1.一切皆文件&#xff1a;Linux系统中基本上都为文件组成&#xff0c;包括配置文件、硬件信息等&#xff1b;2.由重多的单一目的小程序组成&#xff0c;并且将各种小程序组合可以完成复杂任务&#xff1b;3.尽可能避免捕获用户接口&#xff0c;为了方…

android字符串复制到剪贴板

android2.1之后版本 其一&#xff1a;&#xff08;已运行成功 &#xff09;ClipboardManager clip (ClipboardM anager)getSystemService(Context.CLIPB OARD_SERVICE); clip.getText();// 粘贴clip.setText(str); // 复制其二&#xff1a;ClipboardM anager c (ClipboardMana…

date.gethour_Java LocalDateTime类| 带示例的getHour()方法

date.gethourLocalDateTime类getHour()方法 (LocalDateTime Class getHour() method) getHour() method is available in java.time package. getHour()方法在java.time包中可用。 getHour() method is used to get an hour-of-day field value from this date-time object. ge…

JDBC(Java语言连接数据库)

JDBC&#xff08;Java语言连接数据库&#xff09;JDBC本质整体结构基层实现过程&#xff08;即用记事本而不是idea&#xff09;第一种实现方式第二种实现方式乐观锁和悲观锁乐观锁悲观锁JDBC本质 整体结构 基层实现过程&#xff08;即用记事本而不是idea&#xff09; 第一种实…

那些牛逼的数据分析师,SQL用的到底有多溜

从各大招聘网站中可以看到&#xff0c;今年招聘信息少了很多&#xff0c;但数据分析相关岗位有一定增加&#xff0c;而数据分析能力几乎已成为每个岗位的必备技能。是什么原因让企业如此重视“数据人才”&#xff1f;伴随滴滴出行、智慧营销等的落地商用&#xff0c;部分企业尝…

knn机器学习算法_K-最近邻居(KNN)算法| 机器学习

knn机器学习算法Goal: To classify a query point (with 2 features) using training data of 2 classes using KNN. 目标&#xff1a;使用KNN使用2类的训练数据对查询点(具有2个要素)进行分类。 K最近邻居(KNN) (K- Nearest Neighbor (KNN)) KNN is a basic machine learning…

Linux 指令的分类 (man page 可查看)

man page 常用按键 转载于:https://www.cnblogs.com/aoun/p/4324350.html

google高级搜索命令

一、allintitle:当我们用allintitle提交查询的时候&#xff0c;Google会限制搜索结果仅是那些在网页标题里边包含了我们所有查询关键词的网页。例 &#xff3b;allintitle: detect plagiarism&#xff3d;&#xff0c;提交这个查询&#xff0c;Google仅会返回在网页标题里边包含…

Springboot遇到的问题

Springboot遇到的问题1_访问4041.1_url错误1.2_controller和启动项不在同级目录1.3_未加ResponseBody2_字母后端显示大写&#xff0c;传到前端变为小写2.1_Data注释问题1_访问404 1.1_url错误 1.2_controller和启动项不在同级目录 1.3_未加ResponseBody 在方法上面加&#…

45 张图深度解析 Netty 架构与原理

作为一个学 Java 的&#xff0c;如果没有研究过 Netty&#xff0c;那么你对 Java 语言的使用和理解仅仅停留在表面水平&#xff0c;会点 SSH 写几个 MVC&#xff0c;访问数据库和缓存&#xff0c;这些只是初等 Java 程序员干的事。如果你要进阶&#xff0c;想了解 Java 服务器的…