图的遍历:探索节点的奥秘

简介: 本文包括深度优先遍历(DFS)和广度优先遍历(BFS)。

在计算机科学中,图(Graph)是一种重要的数据结构,它由节点(Vertex)和连接节点的边(Edge)组成。图可以用来表示各种实际问题,如社交网络、地图导航、网络连接等。图的遍历是指按照某种规则依次访问图中的所有节点,以便对图进行分析和处理。本文将介绍图的遍历方法,包括深度优先遍历(DFS)和广度优先遍历(BFS)。


深度优先遍历(DFS)

深度优先遍历是一种经典的图遍历方法,它从起始节点开始,沿着一条路径尽可能深入地访问图,直到无法继续为止,然后回退并探索其他路径。这种遍历方式类似于在迷宫中寻找出口,每次都选择一个未探索的通道,直到无法前进,然后返回上一个节点继续探索。


算法步骤

从起始节点开始访问,标记节点为已访问。

对于当前节点,选择一个相邻且未访问过的节点进行访问。

重复步骤2,直到当前节点没有未访问的相邻节点,然后回退到上一个节点。

重复步骤2和3,直到所有节点都被访问过。


#include

#include

#include

using namespace std;


class Graph {

private:

   int V;

   vector> 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 visited(V, false);

       stack s;

       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(4);

   g.addEdge(0, 1);

   g.addEdge(0, 2);

   g.addEdge(1, 2);

   g.addEdge(2, 0);

   g.addEdge(2, 3);

   g.addEdge(3, 3);


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

   g.DFS(2);


   return 0;

}


  0

 / \

1   2

    |

    3

在上图中,我们从节点2开始进行深度优先遍历。首先访问节点2,然后选择一个相邻的未访问节点,即节点0,再继续选择节点1。由于节点1没有未访问的相邻节点,我们回退到节点0,然后再回退到节点2。最终完成了对图中所有节点的遍历。


广度优先遍历(BFS)

广度优先遍历是另一种常用的图遍历方法,它从起始节点开始,先访问所有与起始节点直接相连的节点,然后再依次访问这些节点的相邻节点,以此类推。这种遍历方式类似于水波扩散,先覆盖离起始节点近的区域,然后逐渐扩展到距离更远的区域。


算法步骤

从起始节点开始访问,标记节点为已访问,并将其加入队列。

从队列中取出一个节点,访问它的所有相邻且未访问过的节点,并将它们加入队列。

重复步骤2,直到队列为空。


#include

#include

#include

using namespace std;


class Graph {

private:

   int V;

   vector> 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 BFS(int start) {

       vector visited(V, false);

       queue q;

       q.push(start);


       while (!q.empty()) {

           int current = q.front();

           q.pop();


           if (!visited[current]) {

               cout << current << " ";

               visited[current] = true;

           }


           for (int neighbor : adj[current]) {

               if (!visited[neighbor]) {

                   q.push(neighbor);

               }

           }

       }

   }

};


int main() {

   Graph g(4);

   g.addEdge(0, 1);

   g.addEdge(0, 2);

   g.addEdge(1, 2);

   g.addEdge(2, 0);

   g.addEdge(2, 3);

   g.addEdge(3, 3);


   cout << "Breadth First Traversal (starting from vertex 2): ";

   g.BFS(2);


   return 0;

}


  0

 / \

1   2

     |

    3

我们从节点2开始进行广度优先遍历。首先访问节点2,然后依次访问与节点2相邻且未访问的节点0和3,再访问节点0的相邻节点1。由于节点1没有未访问的相邻节点,我们继续访问节点3的相邻节点。最终完成了对图中所有节点的遍历。


总结

图的遍历是分析和处理图数据结构的重要方法,深度优先遍历和广度优先遍历是其中常用且经典的两种方法。深度优先遍历通过深入探索路径直到无法前进,然后回退探索其他路径。广度优先遍历则先访问所有直接相邻节点,然后逐层扩展。

目录
相关文章
|
运维 监控 安全
云计算MSP行业调研报告
# 1. 概述 ## 1.1 背景和概念 企业上云是当前的大势所趋,但企业上云并非坦途。随着业务、数据等向云端迁移,企业在上云过程中会各种复杂的问题,比如平台选择、系统迁移、多云管理、应用优化以及成本核算和安全管理等问题。要解决这些问题,就需要专业的团队来指导,因此诞生了云MSP。 云MSP即云管理服务提供商(Cloud Management Service Provider),通常是指对接
4656 0
云计算MSP行业调研报告
|
12月前
|
安全 数据处理
(GDPR)是欧盟的一项全面的数据保护法
【10月更文挑战第7天】(GDPR)是欧盟的一项全面的数据保护法
802 3
|
存储 缓存 关系型数据库
MySQL8 中文参考(二十一)(5)
MySQL8 中文参考(二十一)
170 3
|
监控 测试技术
在模型训练中,如何衡量和平衡通用性和特定任务需求的重要性?
在模型训练中,如何衡量和平衡通用性和特定任务需求的重要性?
217 2
|
机器学习/深度学习 人工智能 算法
Scaling Law触礁数据墙?Epoch AI发文预测LLM到2028年耗尽所有文本数据
【6月更文挑战第23天】Epoch AI警告,大语言模型(LLM)可能在2026-2032年间面临“数据墙”,因人类生成文本数据耗尽。论文探讨LLM扩展限制,提出合成数据、迁移学习和提高数据效率作为应对策略,但也引发数据隐私和伦理问题。研究敦促平衡模型发展与数据资源管理[[1](https://arxiv.org/abs/2211.04325)]。
298 6
|
开发工具 git
关于github默认分支名改为main后可能的处理【git推送到远程不同的分支、github修改默认分支名】
git如何删除本地分支、删除远程分支,由分支的删除可以实现推送到远程不同的分支。 git不允许推送到远程与本地分支名不同的分支上。
1255 1
|
SQL 关系型数据库 MySQL
Windows 10安装MySQL 5.7完整教程
Windows 10安装MySQL 5.7完整教程
818 2
|
Web App开发 测试技术 数据中心
Terraform Module 编写指南
Module 是一个Terraform 模板,是对多个子节点,子资源,子架构模板的组合和抽象。利用Module 在降低模板编写和维护复杂度的同时,使得模板结构更加简洁清楚。为什么要使用 Module,详见文章[ Module 让 Terraform 使用更简单](https://www.atatech.org/articles/119465)。
8133 0
|
机器学习/深度学习 算法 Python
探索Python中的基础算法:梯度提升机(GBM)
探索Python中的基础算法:梯度提升机(GBM)
630 2
|
SQL 缓存 关系型数据库
MySQL explain 中的 rows 究竟是如何计算的?
今天同事在处理系统慢SQL时遇到几个疑惑的问题,简单描述如下~
MySQL explain 中的 rows 究竟是如何计算的?