深度优先遍历(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树,以起始节点为根,并且按照访问的次序来连接各个节点。这棵树能够展示起始节点出发的探索路径。

目录
相关文章
|
2月前
|
运维 监控 安全
如何搭建RWA代币化落地实操流程清单
系统化推进RWA代币化落地,从目标拆解、模块验收到资源盘点,构建可复用的流程模板。覆盖合约设计、合规审查、数据对接等关键环节,配套标准化操作蓝图与风险应对清单,支持快速迭代与跨团队协作,确保项目可控、可验、可持续交付。(238字)
|
16天前
|
人工智能 自然语言处理 算法
2025 年GEO行业年度发展报告
2025年全球生成式引擎优化(GEO)行业迎来规模化爆发,市场规模突破120亿美元,亚太成增长核心。技术实现多模态、实时语义突破,中国服务商即搜AI、边鱼科技凭借高效响应与本地化能力崛起,推动全球竞争格局重塑,开启AI时代“信源主权”争夺新阶段。(238字)
|
网络协议 Linux 网络安全
如何用阿里云实现内网穿透?如何在外网访问家里内网设备?
使用NPS自建内网穿透服务器教程,带WEB管理
36354 12
|
机器学习/深度学习 人工智能 自然语言处理
Voice-Pro:开源AI音频处理工具,集成转录、翻译、TTS等一站式服务
Voice-Pro是一款开源的多功能音频处理工具,集成了语音转文字、文本转语音、实时翻译、YouTube视频下载和人声分离等多种功能。它支持超过100种语言,适用于教育、娱乐和商业等多个领域,为用户提供一站式的音频处理解决方案,极大地提高工作效率和音频处理的便捷性。
1094 10
Voice-Pro:开源AI音频处理工具,集成转录、翻译、TTS等一站式服务
|
弹性计算
阿里云10M带宽收费价格表
阿里云10M带宽收费价格表,阿里云服务器上海地域10M带宽一年优惠价格5355元,10M带宽一个月525元,地域不同带宽价格不同,阿里云服务器网以华东1(上海)地域为例,5M及5M以下带宽按照23元一个月的价格收取,6M及6M以上公网带宽按照80元一个月的价格收取。阿里云百科使用阿里云价格计算器,计算一下阿里云10M公网带宽一个月价格和一年价格
409 0
|
缓存 运维 NoSQL
使用 psutil 获取硬件、网络以及进程信息
使用 psutil 获取硬件、网络以及进程信息
268 0
|
人工智能
天梯赛-L1-064 估值一亿的AI核心代码 (20 分)--2019全国CCCC天梯赛L1题解
天梯赛-L1-064 估值一亿的AI核心代码 (20 分)--2019全国CCCC天梯赛L1题解
599 0
|
监控 供应链 定位技术
ERP系统中的销售订单处理与订单跟踪
【7月更文挑战第25天】 ERP系统中的销售订单处理与订单跟踪
1069 0
adb的server和client的匹配误区
adb的server和client的匹配误区
|
算法 索引
【洛谷 P1923】【深基9.例4】求第 k 小的数 题解(快速排序)
该题目要求输入一组不超过5000000个奇数个整数,并找出其中第k小的数,不使用`nth_element`函数,而是通过实现快速排序来解决。样例输入为5个数1, 4, 3, 2, 5,k=1,输出第1小的数即最小值2。代码中定义了快速排序函数`quickSort`和划分函数`partition`,并使用`read`函数读取输入。在主函数中对数组进行排序后输出第k个元素。
223 0