当前位置: 首页 > news >正文

图的遍历:深度优先搜索(DFS)

引言

图遍历是指按照一定的顺序访问图中的每个顶点。遍历图的两种主要方法是深度优先搜索(Depth-First Search, DFS)和广度优先搜索(Breadth-First Search, BFS)。本文将详细介绍深度优先搜索的定义、算法及其实现。

深度优先搜索(DFS)

定义

深度优先搜索(DFS)是一种遍历或搜索图的算法,从图的某个起始顶点开始,尽可能深入地访问每一个顶点,直到无法继续为止,然后回溯并继续搜索未访问的顶点。

算法步骤

  1. 从起始顶点开始,标记该顶点为已访问。
  2. 递归地访问所有未被访问的邻接顶点。
  3. 回溯到上一个顶点,继续访问其他未被访问的邻接顶点,直到所有顶点都被访问。

示例

假设我们有一个无向图,顶点集合为 ({A, B, C, D, E, F}),边集合为 ({(A, B), (A, C), (B, D), (C, E), (D, F)})。

A
B
C
D
E
F

DFS实现(递归方式)

下面是用Java实现DFS的代码示例:

import java.util.LinkedList;
import java.util.List;public class Graph {private LinkedList<Integer>[] adjLists; // 邻接表数组private boolean[] visited; // 访问标记数组// 构造函数public Graph(int numVertices) {adjLists = new LinkedList[numVertices];visited = new boolean[numVertices];for (int i = 0; i < numVertices; i++) {adjLists[i] = new LinkedList<>();}}// 添加边public void addEdge(int i, int j) {adjLists[i].add(j);adjLists[j].add(i); // 无向图}// 深度优先搜索public void DFS(int vertex) {visited[vertex] = true;System.out.print(vertex + " ");for (int adj : adjLists[vertex]) {if (!visited[adj]) {DFS(adj);}}}// 打印邻接表public void printAdjLists() {for (int i = 0; i < adjLists.length; i++) {System.out.print(i + ": ");for (int j : adjLists[i]) {System.out.print(j + " ");}System.out.println();}}public static void main(String[] args) {Graph graph = new Graph(6);graph.addEdge(0, 1);graph.addEdge(0, 2);graph.addEdge(1, 3);graph.addEdge(2, 4);graph.addEdge(3, 5);System.out.println("图的邻接表表示:");graph.printAdjLists();System.out.println("深度优先搜索遍历结果:");graph.DFS(0); // 输出:0 1 3 5 2 4}
}

DFS实现(非递归方式)

下面是用Java实现DFS的非递归方式的代码示例:

import java.util.LinkedList;
import java.util.List;
import java.util.Stack;public class Graph {private LinkedList<Integer>[] adjLists; // 邻接表数组private boolean[] visited; // 访问标记数组// 构造函数public Graph(int numVertices) {adjLists = new LinkedList[numVertices];visited = new boolean[numVertices];for (int i = 0; i < numVertices; i++) {adjLists[i] = new LinkedList<>();}}// 添加边public void addEdge(int i, int j) {adjLists[i].add(j);adjLists[j].add(i); // 无向图}// 深度优先搜索(非递归)public void DFS(int vertex) {Stack<Integer> stack = new Stack<>();stack.push(vertex);while (!stack.isEmpty()) {int v = stack.pop();if (!visited[v]) {visited[v] = true;System.out.print(v + " ");}for (int adj : adjLists[v]) {if (!visited[adj]) {stack.push(adj);}}}}// 打印邻接表public void printAdjLists() {for (int i = 0; i < adjLists.length; i++) {System.out.print(i + ": ");for (int j : adjLists[i]) {System.out.print(j + " ");}System.out.println();}}public static void main(String[] args) {Graph graph = new Graph(6);graph.addEdge(0, 1);graph.addEdge(0, 2);graph.addEdge(1, 3);graph.addEdge(2, 4);graph.addEdge(3, 5);System.out.println("图的邻接表表示:");graph.printAdjLists();System.out.println("深度优先搜索遍历结果:");graph.DFS(0); // 输出:0 2 4 1 3 5}
}

DFS算法步骤图解

以下是对上述示例中DFS算法步骤的图解:

0
1
2
3
4
5
访问顶点0
访问顶点1
访问顶点3
访问顶点5
回溯到顶点3
回溯到顶点1
回溯到顶点0
访问顶点2
访问顶点4

结论

通过上述讲解和实例代码,我们详细展示了深度优先搜索(DFS)的定义、算法及其实现。DFS是一种重要的图遍历算法,广泛应用于各种场景。希望这篇博客对您有所帮助!


如果您觉得这篇文章对您有帮助,请关注我的CSDN博客,点赞并收藏这篇文章,您的支持是我持续创作的动力!


关键内容总结

  • 深度优先搜索(DFS)的定义
  • DFS算法的步骤
  • DFS的递归和非递归实现
  • DFS算法的图解

推荐阅读:深入探索设计模式专栏,详细讲解各种设计模式的应用和优化。点击查看:深入探索设计模式。


特别推荐:设计模式实战专栏,深入解析设计模式的实际应用,提升您的编程技巧。点击查看:设计模式实战。

如有任何疑问或建议,欢迎在评论区留言讨论。谢谢阅读!


测试代码的运行结果:

  • 邻接表表示
0: 1 2 
1: 0 3 
2: 0 4 
3: 1 5 
4: 2 
5: 3 
  • 深度优先搜索遍历结果

递归方式:0 1 3 5 2 4

非递归方式:0 2 4 1 3 5

相关文章:

图的遍历:深度优先搜索(DFS)

引言 图遍历是指按照一定的顺序访问图中的每个顶点。遍历图的两种主要方法是深度优先搜索&#xff08;Depth-First Search, DFS&#xff09;和广度优先搜索&#xff08;Breadth-First Search, BFS&#xff09;。本文将详细介绍深度优先搜索的定义、算法及其实现。 深度优先搜…...

普元EOS学习笔记-某些版本的EOS提供的maven获取依赖失败的问题解决

前言 普元EOS的开发包中&#xff0c;提供了maven&#xff0c;因为EOS项目的某些依赖只能从普元官方仓库获取&#xff0c;因此&#xff0c;编译EOS项目必须使用EOS提供的maven。 maven拉取依赖失败 某些版本的EOS提供的maven在编译EOS项目的时候会出现拉取失败的现象。 [FATA…...

Pycharm + Pyside6

1. 使用 Qt designer 创建 UI 文件 2. 使用 UIC 工具生成 ui_.py 文件 3. 自定义类导入ui.py 文件的窗口类 4.自定义窗口继承UI窗体类 5. self.setupUi(self) from PySide6.QtWidgets import QApplication, QWidget, QComboBox, QVBoxLayout from ui_test import Ui_Formc…...

强化学习之价值迭代算法动态规划求解悬崖漫步环境(CliffWalking)最优策略及最优状态价值函数

class CliffWalkingEnv:def __init__(self,ncol12,nrow4):self.ncolncol#定义网格世界的列self.nrownrow#定义网格世界的行self.Pself.createP()#转移矩阵P[state][action][(p,next_state,reward,done)]包含下一个状态和奖励def createP(self):P[[[]for i in range(4)]for j in…...

javascript deriveKey和deriveBits()由主密钥派生出新的密钥进行加密

deriveKey 方法的完整示例&#xff0c;演示如何使用 HMAC 作为密钥派生函数&#xff08;KDF&#xff09;来从一个给定的秘密&#xff08;如密码&#xff09;派生出一个新的 AES 加密密钥。 //创建一个函数来生成随机盐function getRandomSalt(length){let arraynew Uint8Array…...

基于微信小程序的自习室选座系统/基于Java的自习室选座系统/自习室管理系统的设计与实现

获取源码联系方式请查看文章结尾&#x1f345; 摘要 自习室选座是学校针对用户必不可少的一个部分。在学校的整个过程中&#xff0c;学生担负着最重要的角色。为满足如今日益复杂的管理需求&#xff0c;各类微信小程序自习室选座也在不断改进。本课题所设计的小程序自习室选座系…...

echarts所遇到的问题,个人记录

TreeMap 矩形树图&#xff0c;label设置富文本之后&#xff0c;无法垂直居中 font-size 支持rem&#xff0c;其余不支持 font-size 支持 rem&#xff0c;但是其余的属性如height&#xff0c;width等不支持 echarts-for-react 绑定事件&#xff0c;会覆盖实例上绑定的 当给cha…...

Skyeye云智能制造企业版源代码全部开放

智能制造一体化管理系统 [SpringBoot2 - 快速开发平台]&#xff0c;适用于制造业、建筑业、汽车行业、互联网、教育、政府机关等机构的管理。包含文件在线操作、工作日志、多班次考勤、CRM、ERP 进销存、项目管理、EHR、拖拽式生成问卷、日程、笔记、工作计划、行政办公、薪资模…...

Springboot 整合Elasticsearch

1 java操作ES方式 1.1 操作ES 9300端口(TCP) 但开发中不在9300进行操作 ES集群节点通信使用的也是9300端口如果通过9300操作ES&#xff0c;需要与ES建立长连接 可通过引入spring-data-elasticsearch:transport-api.jar不在9300操作原因&#xff1a;1.springboot版本不同&…...

WeNet环境配置与aishell模型训练

WeNet环境配置与aishell模型训练 1环境配置 踩坑记录&#xff1a; 系统使用win11&#xff0c;我根据wenet官方文档&#xff0c;使用conda虚拟环境安装了cuda12.1&#xff0c;安装wenet依赖库&#xff0c;其中deepspeed报错&#xff0c;根据报错信息查询github&#xff0c;发现…...

【C++的剃刀】我不允许你还不会AVL树

​ 学习编程就得循环渐进&#xff0c;扎实基础&#xff0c;勿在浮沙筑高台 循环渐进Forward-CSDN博客 Hello,这里是kiki&#xff0c;今天继续更新C部分&#xff0c;我们继续来扩充我们的知识面&#xff0c;我希望能努力把抽象繁多的知识讲的生动又通俗易懂&#xff0c;今天要…...

React搭建Vite项目及各种项目配置

1. 创建Vite项目 在操作系统的命令终端&#xff0c;输入以下命令&#xff1a; yarn create vite 输入完成以后输入项目名称、选择开发框架&#xff0c;选择开发语言&#xff0c;如下图所示&#xff0c;即可完成项目创建。 注意事项&#xff1a; 1. Node版本必须符合要求&…...

Linux Vim教程:多文件编辑与窗口管理

目录 1. 多文件编辑基础 1.1 缓冲区管理 1.2 标签页管理 1.3 分屏管理 2. 多文件编辑的高级技巧 2.1 同时编辑多个文件 2.2 使用会话 2.3 使用寄存器 3. 窗口管理的实用技巧 3.1 窗口调整 3.2 窗口排列 3.3 快速切换 4. 使用插件增强多文件编辑与窗口管理 4.1 NE…...

C语言进阶 11.结构体

C语言进阶 11.结构体 文章目录 C语言进阶 11.结构体11.1. 枚举11.2. 结构类型11.3. 结构与函数11.4. 结构中的结构11.5. 类型定义11.6. 联合11.7. PAT11-0. 平面向量加法(10)11-1. 通讯录的录入与显示(10) 11.1. 枚举 常量符号化: 用符号而不是具体的数字表示程序中的数字 cons…...

Vue--解决error:0308010C:digital envelope routines::unsupported

原文网址&#xff1a;Vue--解决error:0308010C:digital envelope routines::unsupported_IT利刃出鞘的博客-CSDN博客 简介 本文介绍如何解决node.js在运行Vue项目时的报错&#xff1a;error:0308010C:digital envelope routines::unsupported。 问题描述 使用node.js运行Vu…...

go-kratos 学习笔记(6) 数据库gorm使用

数据库是项目的核心&#xff0c;数据库的链接数据是data层的操作&#xff0c;选择了比较简单好用的gorm作为数据库的工具&#xff1b;之前是PHP开发&#xff0c;各种框架都是orm的操作&#xff1b;gorm还是很相似的&#xff0c;使用起来比较顺手 go-kratos官网的实例是ent&…...

记录:vite打包报错 error during build: Error: Parse error @:1:1

vant从3升级到4后&#xff0c;本地运行没问题&#xff0c; 但是打包就会报如下错误&#xff1a;error during build: Error: Parse error :1:1 一直以为是vant的问题&#xff0c;各种升级&#xff0c;替换插件&#xff0c;发现没什么用&#xff0c; 网上搜索了下&#xff0c;…...

Python 消费Kafka手动提交 批量存入Elasticsearch

一、第三方包选择 pip install kafka&#xff0c;对比了kafka和pykafka&#xff0c;还是选择kafka&#xff0c;消费速度更快pip install elasticsearch7.12.0(ES版本) 二、创建es连接对象 from elasticsearch import Elasticsearch from elasticsearch.helpers import bulkc…...

oracle 基础知识表的主键

一、表的约束条件 •约束条件是施加在表的字段上的一组限制条件&#xff0c;它使得只有符合限制条件要求的数据才能输入表。 •保证了表中的数据的正确性 i.约束条件包括了&#xff1a;非空和唯一和核对&#xff0c;即not null 和unique 和check null的含义:不确定 3个人去捡苹…...

opencascade AIS_MouseGesture AIS_MultipleConnectedInteractive源码学习

AIS_MouseGesture //! 鼠标手势 - 同一时刻只能激活一个。 enum AIS_MouseGesture { AIS_MouseGesture_NONE, //!< 无激活手势 // AIS_MouseGesture_SelectRectangle, //!< 矩形选择&#xff1b; //! 按下按钮开始&#xff0c;移动鼠标定义矩形&…...

告别规则几何!用Python+Matlab为gprMax创建任意复杂地质模型(附HDF5文件生成代码)

突破几何限制&#xff1a;用PythonMatlab构建gprMax复杂地质模型的完整指南 地质雷达模拟领域的研究者常面临一个尴尬困境&#xff1a;脑海中的地质结构复杂多变&#xff0c;但建模工具却只能生成规则几何体。本文将彻底解决这一矛盾&#xff0c;带您掌握跨平台协作建模技术&am…...

ContextMenuManager:高效管理Windows右键菜单的全方案

ContextMenuManager&#xff1a;高效管理Windows右键菜单的全方案 【免费下载链接】ContextMenuManager &#x1f5b1;️ 纯粹的Windows右键菜单管理程序 项目地址: https://gitcode.com/gh_mirrors/co/ContextMenuManager Windows右键菜单是我们日常操作电脑时最常用的…...

ollama-QwQ-32B微调实践:优化OpenClaw的鼠标操作准确率

ollama-QwQ-32B微调实践&#xff1a;优化OpenClaw的鼠标操作准确率 1. 为什么需要微调模型&#xff1f; 去年冬天&#xff0c;当我第一次用OpenClaw自动整理桌面文件时&#xff0c;眼睁睁看着它把"季度报表.xlsx"拖进了"娱乐"文件夹——这个哭笑不得的瞬…...

Arduino ESP平台MQTT固件空中升级(FUOTA)轻量库

1. 项目概述mqtt_fuota_duino是一个面向资源受限嵌入式物联网终端的轻量级固件空中升级&#xff08;Firmware Update Over-The-Air, FUOTA&#xff09;库&#xff0c;专为 Arduino 生态设计&#xff0c;深度适配 ESP8266 和 ESP32 平台。其核心使命并非替代标准 HTTP/HTTPS OTA…...

影墨·今颜GPU利用率提升方案:4-bit NF4量化让FLUX.1-dev响应提速300%

影墨今颜GPU利用率提升方案&#xff1a;4-bit NF4量化让FLUX.1-dev响应提速300% 1. 引言&#xff1a;当艺术创作遇上性能瓶颈 如果你用过AI绘画工具&#xff0c;尤其是那些追求极致写实效果的&#xff0c;大概率经历过这样的等待&#xff1a;输入一段精心构思的描述&#xff…...

FastAPI CSP哈希:nonce与sha256的终极安全防护指南

FastAPI CSP哈希&#xff1a;nonce与sha256的终极安全防护指南 【免费下载链接】fastapi FastAPI framework, high performance, easy to learn, fast to code, ready for production 项目地址: https://gitcode.com/GitHub_Trending/fa/fastapi FastAPI作为一款高性能、…...

微信小程序UI组件库终极指南:WeUI-WXSS与Vant、ColorUI深度对比分析

微信小程序UI组件库终极指南&#xff1a;WeUI-WXSS与Vant、ColorUI深度对比分析 【免费下载链接】weui-wxss A UI library by WeChat official design team, includes the most useful widgets/modules. 项目地址: https://gitcode.com/gh_mirrors/we/weui-wxss WeUI-WX…...

如何评估企业的敏捷管理能力价值

如何评估企业的敏捷管理能力价值关键词&#xff1a;企业敏捷管理能力、评估价值、敏捷方法、绩效指标、价值驱动因素摘要&#xff1a;本文旨在深入探讨如何评估企业的敏捷管理能力价值。首先介绍了评估的背景&#xff0c;包括目的、预期读者、文档结构和相关术语。接着阐述了敏…...

FlashAttention 终极指南:如何实现4倍加速与20倍内存优化的革命性技术

FlashAttention 终极指南&#xff1a;如何实现4倍加速与20倍内存优化的革命性技术 【免费下载链接】flash-attention Fast and memory-efficient exact attention 项目地址: https://gitcode.com/GitHub_Trending/fl/flash-attention FlashAttention 是一种革命性的注意…...

别再只盯着代码了!手把手教你读懂Cartographer的PGM和YAML地图文件(附Notepad++实操)

从二进制到坐标系&#xff1a;Cartographer地图文件深度解析与实战调参指南 当你第一次打开Cartographer生成的.pgm和.yaml文件时&#xff0c;是否感觉像在解读某种外星密码&#xff1f;那些数字和参数背后&#xff0c;藏着机器人如何理解世界的秘密。本文将带你像侦探一样拆解…...