深度优先遍历(DFS):探索图的奥秘

简介: 当进行深度优先遍历(DFS)时,我们需要按照一定的步骤来遍历图中的节点。选择起始节点:选择图中的一个起始节点作为遍历的起点。标记已访问:将起始节点标记为已访问,并将其放入数据结构中,比如栈或递归调用。探索相邻节点:从起始节点开始,探索与其相邻的节点。这是通过查找邻接表来实现的,邻接表存储了每个节点的相邻节点信息。深入探索:选择一个相邻节点,标记为已访问,并将其放入数据结构中。然后,从这个相邻节点出发,继续探索其相邻节点,形成一个深入的路径。这一步是递归的核心。回溯:当没有未访问的相邻节点时,回溯到上一个节点,继续探索其他未访问的相邻节点。这可以通过从数据结构中弹出节点来实现,或者从递


图论节点

深度优先遍历(Depth-First Search,简称DFS)是一种用于图遍历的基本算法。它通过深入地探索图中的路径,尽可能远地访问未被访问的节点。在本文中,我们将详细介绍深度优先遍历的概念、算法步骤。


概念

深度优先遍历的基本思想是从图的某一节点出发,沿着一条路径一直探索到达最远的节点,然后回退到前一个节点,继续探索下一条路径,直到所有的节点都被访问过。


当进行深度优先遍历(DFS)时,我们需要按照一定的步骤来遍历图中的节点。

选择起始节点:选择图中的一个起始节点作为遍历的起点。


标记已访问:将起始节点标记为已访问,并将其放入数据结构中,比如栈或递归调用。


探索相邻节点:从起始节点开始,探索与其相邻的节点。这是通过查找邻接表来实现的,邻接表存储了每个节点的相邻节点信息。


深入探索:选择一个相邻节点,标记为已访问,并将其放入数据结构中。然后,从这个相邻节点出发,继续探索其相邻节点,形成一个深入的路径。这一步是递归的核心。


回溯:当没有未访问的相邻节点时,回溯到上一个节点,继续探索其他未访问的相邻节点。这可以通过从数据结构中弹出节点来实现,或者从递归调用中返回。


重复步骤3至步骤5:重复以上步骤,直到所有节点都被访问。在遍历过程中,我们会在每一步都遵循深入路径并回溯的原则,直到没有未访问的节点为止。


通过以上步骤,DFS能够遍历图中的所有节点,同时可以生成一棵DFS树,它展示了从起始节点出发的探索路径。


#include <iostream>

#include <vector>

#include <stack>

using namespace std;


class Graph {

private:

   int V; // 节点数

   vector<vector<int>> adj; // 邻接表


public:

   Graph(int vertices) : V(vertices) {

       adj.resize(V);

   }


   void addEdge(int u, int v) {

       adj[u].push_back(v);

       adj[v].push_back(u);

   }


   void DFS(int start) {

       vector<bool> visited(V, false); // 记录节点是否被访问过

       stack<int> s; // 使用栈来辅助实现DFS

       s.push(start);


       while (!s.empty()) {

           int current = s.top();

           s.pop();


           if (!visited[current]) {

               cout << current << " ";

               visited[current] = true;

           }


           // 将当前节点的未访问相邻节点入栈

           for (int neighbor : adj[current]) {

               if (!visited[neighbor]) {

                   s.push(neighbor);

               }

           }

       }

   }

};


int main() {

   Graph g(5); // 创建一个有5个节点的图

   g.addEdge(0, 1);

   g.addEdge(0, 2);

   g.addEdge(1, 3);

   g.addEdge(1, 4);


   cout << "Depth First Traversal (starting from vertex 0): ";

   g.DFS(0);


   return 0;

}

所以我们步骤可以归结为

1. 选择起始节点

DFS的第一步是选择一个起始节点作为遍历的起点。这个起始节点是从图中的一个节点开始的位置,用来启动遍历过程。


2. 标记已访问

一旦选择了起始节点,我们将其标记为“已访问”,以确保我们不会重复访问同一个节点。


3. 探索相邻节点

从起始节点开始,我们探索与其相邻的节点。图可以用邻接表或邻接矩阵来表示。在深度优先遍历中,我们会按顺序检查一个节点的相邻节点,并选择一个尚未访问的相邻节点进行下一步探索。


4. 深入探索

一旦我们选择了一个未访问的相邻节点,我们会进一步深入探索该节点。这是通过递归或栈(堆栈)的方式实现的。我们将选定的相邻节点标记为已访问,并将其添加到遍历路径中,然后以该节点为起点继续探索其相邻节点。


5. 回溯

如果一个节点的所有相邻节点都已被访问,或者没有相邻节点,我们将回溯到之前的节点。这可以通过从栈中弹出节点或者从递归调用中返回来实现。回溯是深度优先遍历的一个关键特性,它允许我们在一个路径被完全探索后,返回到之前的节点继续探索其他路径。


6. 重复探索步骤

我们重复以上步骤,直到所有节点都被访问。在遍历的过程中,我们会遵循深入路径并回溯的原则,直到所有节点都被访问为止。


在DFS过程中,我们可以生成一棵DFS树,以起始节点为根,并且按照访问的次序来连接各个节点。这棵树能够展示起始节点出发的探索路径。

目录
相关文章
|
弹性计算 监控 数据可视化
ECS网络流量监控
ECS网络流量监控
932 2
|
7月前
|
运维 监控 安全
如何搭建RWA代币化落地实操流程清单
系统化推进RWA代币化落地,从目标拆解、模块验收到资源盘点,构建可复用的流程模板。覆盖合约设计、合规审查、数据对接等关键环节,配套标准化操作蓝图与风险应对清单,支持快速迭代与跨团队协作,确保项目可控、可验、可持续交付。(238字)
|
10月前
|
监控 前端开发 安全
如何集成第三方支付API到电商网站
在电商网站中,集成第三方支付API是确保交易安全、提升用户体验的关键步骤。本文详细介绍了从选择支付提供商到上线监控的全流程,涵盖代码示例与实用建议,助您高效实现支付功能。
|
6月前
|
设计模式 Java
【TMF】源码分析 1.0 LatticeClassLoader
LatticeClassLoader扩展Java双亲委派模型,支持多自定义类加载器的委托加载。类加载失败后依次尝试自定义加载器,实现插件化容错;资源获取优先父加载器,支持单资源查找与多资源聚合,适用于插件系统、多租户隔离及SPI扩展,保障业务隔离与灵活扩展。
257 1
|
5月前
|
人工智能 自然语言处理 算法
2025 年GEO行业年度发展报告
2025年全球生成式引擎优化(GEO)行业迎来规模化爆发,市场规模突破120亿美元,亚太成增长核心。技术实现多模态、实时语义突破,中国服务商即搜AI、边鱼科技凭借高效响应与本地化能力崛起,推动全球竞争格局重塑,开启AI时代“信源主权”争夺新阶段。(238字)
|
机器学习/深度学习 人工智能 自然语言处理
Voice-Pro:开源AI音频处理工具,集成转录、翻译、TTS等一站式服务
Voice-Pro是一款开源的多功能音频处理工具,集成了语音转文字、文本转语音、实时翻译、YouTube视频下载和人声分离等多种功能。它支持超过100种语言,适用于教育、娱乐和商业等多个领域,为用户提供一站式的音频处理解决方案,极大地提高工作效率和音频处理的便捷性。
1785 10
Voice-Pro:开源AI音频处理工具,集成转录、翻译、TTS等一站式服务
|
SQL 缓存 关系型数据库
SQL为什么不建议执行多表关联查询
本文探讨了SQL中不建议执行多表关联查询的原因,特别是MySQL与PG在多表关联上的区别。MySQL仅支持嵌套循环连接,而不支持排序-合并连接和散列连接,因此在多表(超过3张)关联查询时效率较低。文章还分析了多表关联查询与多次单表查询的效率对比,指出将关联操作放在Service层处理的优势,包括减少数据库计算资源消耗、提高缓存效率、降低锁竞争以及更易于分布式扩展等。最后,通过实例展示了如何分解关联查询以优化性能。
526 0
adb的server和client的匹配误区
adb的server和client的匹配误区
|
弹性计算
阿里云10M带宽收费价格表
阿里云10M带宽收费价格表,阿里云服务器上海地域10M带宽一年优惠价格5355元,10M带宽一个月525元,地域不同带宽价格不同,阿里云服务器网以华东1(上海)地域为例,5M及5M以下带宽按照23元一个月的价格收取,6M及6M以上公网带宽按照80元一个月的价格收取。阿里云百科使用阿里云价格计算器,计算一下阿里云10M公网带宽一个月价格和一年价格
692 0
|
设计模式 前端开发 C#
WPF/C#:理解与实现WPF中的MVVM模式
WPF/C#:理解与实现WPF中的MVVM模式
1925 0