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

目录
相关文章
|
网络协议 Linux 网络安全
如何用阿里云实现内网穿透?如何在外网访问家里内网设备?
使用NPS自建内网穿透服务器教程,带WEB管理
34585 12
|
SQL 存储 关系型数据库
精通MySQL:从基础到高级应用与最佳实践
第一章:MySQL基础入门 1.1 MySQL概述 介绍MySQL的历史、发展、优势以及应用领域
|
编解码 搜索推荐 开发者
FFmpeg开发笔记(三)FFmpeg的可执行程序介绍
FFmpeg提供ffmpeg、ffplay和ffprobe三个可执行程序。ffmpeg用于音视频转换和查询支持信息,如编解码器、文件格式和协议。ffplay是一个简单的播放器,支持播放音视频并显示相关信息。ffprobe用于分析多媒体文件参数和数据包详情。《FFmpeg开发实战:从零基础到短视频上线》一书提供更深入的开发知识。
218 4
FFmpeg开发笔记(三)FFmpeg的可执行程序介绍
|
存储 人工智能 C++
【PTA】L1-064 估值一亿的AI核心代码(详C++)
【PTA】L1-064 估值一亿的AI核心代码(详C++)
360 1
|
监控 供应链 定位技术
ERP系统中的销售订单处理与订单跟踪
【7月更文挑战第25天】 ERP系统中的销售订单处理与订单跟踪
964 0
|
算法 索引
【洛谷 P1923】【深基9.例4】求第 k 小的数 题解(快速排序)
该题目要求输入一组不超过5000000个奇数个整数,并找出其中第k小的数,不使用`nth_element`函数,而是通过实现快速排序来解决。样例输入为5个数1, 4, 3, 2, 5,k=1,输出第1小的数即最小值2。代码中定义了快速排序函数`quickSort`和划分函数`partition`,并使用`read`函数读取输入。在主函数中对数组进行排序后输出第k个元素。
172 0
|
存储 人工智能 C++
2021 第十二届蓝桥杯大赛软件赛省赛,C/C++ 大学B组题解
**比赛时长:** 四个小时 **比赛规则:** 蓝桥杯比赛跟天梯赛、ACM还不太一样,比赛中提交的答案并没有反馈机制,也就是说你提交了答案以后,自己并不知道是对是错,就像考试一样,只有交了卷,成绩下来以后才能知道自己的奖项。 **满分150** T1-T5答案提交共45分,分值分别是5,5,10,10,15 T6-T10为程序提交共105分,分值分别是15,20,20,25,25 **T6-T10开放补题** 提交链接:https://lx.lanqiao.cn/problemset.page 搜索【第十二届】【省赛】【B组】 **一般来说,蓝桥杯=暴力杯** 前六题都做对共60分,后
715 1
|
算法
深度优先搜索(DFS)的基础理解与实现
深度优先搜索(DFS)的基础理解与实现
200 0
|
监控 网络协议 安全
网络:IP地址、子网掩码、网络地址、广播地址、网段、网关
网络:IP地址、子网掩码、网络地址、广播地址、网段、网关
2975 1
网络:IP地址、子网掩码、网络地址、广播地址、网段、网关
|
机器学习/深度学习 自然语言处理 数据可视化
NeurlPS 2022 | 全新大模型参数高效微调方法SSF:仅需训练0.3M的参数,效果卓越
NeurlPS 2022 | 全新大模型参数高效微调方法SSF:仅需训练0.3M的参数,效果卓越
294 0
NeurlPS 2022 | 全新大模型参数高效微调方法SSF:仅需训练0.3M的参数,效果卓越