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

目录
相关文章
|
3月前
|
存储 算法 Java
【DFS(深度优先搜索)详解】看这一篇就够啦
本文介绍了深度优先搜索(DFS)算法及其应用。DFS从某个顶点出发,深入探索图的每条路径,直到无法前进为止,然后回溯。文章详细解释了DFS的基本思想,并通过示例图展示了其执行过程。此外,文中还探讨了三种枚举方式:指数型枚举、排列型枚举和组合型枚举,并提供了具体的代码实现。最后,文章通过几道练习题帮助读者更好地理解和应用DFS算法。
2463 19
|
算法
广度优先遍历(BFS):逐层探索图的算法奥秘
在图论中,广度优先遍历(Breadth-First Search,BFS)是一种图遍历算法,它以一种逐层的方式探索图的节点。通过从起始节点开始,逐层向外扩展,BFS能够帮助我们解决许多与图相关的问题。
135 0
|
7月前
|
算法
深度优先搜索(DFS)的基础理解与实现
深度优先搜索(DFS)的基础理解与实现
93 0
|
数据采集 算法 C++
DFS(深度优先搜索)详解(概念讲解,图片辅助,例题解释,剪枝技巧)
DFS(深度优先搜索)详解(概念讲解,图片辅助,例题解释,剪枝技巧)
1152 0
|
算法
从三道leetcode掌握深度优先搜索(DFS)
前言 无论在算法面试还是刷题中,深度优先搜索(DFS)和广度优先搜索(BFS)都是一个绕不过去的坎。不同于数组的从左至右遍历,循环常用于一维数据结构的遍历。而DFS和BFS则常用于多维数据结构的遍历,最常见的莫过于嵌套结构的多叉树了。
|
算法 C语言
经典算法之深度优先搜索(DFS)
经典算法之深度优先搜索(DFS)
|
算法 Java
java实现图的深度优先搜索(DFS)和广度优先搜索(BFS)
深度优先搜索、宽度优先搜索算法属于图算法的一种。
689 0
java实现图的深度优先搜索(DFS)和广度优先搜索(BFS)
|
存储
图 无向网 采用邻接矩阵存储结构 按深度优先搜索和广度优先搜索遍历图 (DFS,BFS)实验报告 数据结构
图 无向网 采用邻接矩阵存储结构 按深度优先搜索和广度优先搜索遍历图 (DFS,BFS)实验报告 数据结构
157 0
图 无向网 采用邻接矩阵存储结构 按深度优先搜索和广度优先搜索遍历图 (DFS,BFS)实验报告 数据结构