讲师中心 微信公众号
AI工具推荐 视频效率加速

数据结构中怎么用图的深度优先搜索判断有向图环路

胖涛吖_9458

胖涛吖_9458

发布时间:2026-08-09 14:48:00

|

629人浏览过

|

来源于php中文网

原创

用DFS判断有向图是否存在环的核心是追踪当前递归路径,通过三色法(白/灰/黑)或显式递归栈检测灰色节点或栈中重复节点,需遍历所有未访问起点,时间复杂度O(V+E)。

数据结构中怎么用图的深度优先搜索判断有向图环路

用深度优先搜索(DFS)判断有向图是否存在环路,核心是追踪“当前递归路径”——只要在遍历过程中发现某节点被再次访问,且它还处于当前调用栈中,就说明存在环。

状态标记三色法

给每个节点标记三种状态:

  • 未访问(白色):还没开始处理这个节点
  • 访问中(灰色):已进入DFS递归,但尚未回溯退出(即还在当前路径上)
  • 已访问(黑色):DFS已完整遍历完该节点及其所有后代,可安全忽略

当从节点 u 遍历到邻接点 v 时,若 v 是灰色,说明 v 在当前路径中,u→v 构成一条后向边,必然存在环(比如 u→…→v→…→u)。

递归栈显式跟踪

不依赖颜色标记,也可用一个布尔数组或哈希集合记录当前递归栈中的节点:

  • 进入DFS函数前,把当前节点加入栈
  • 对每个邻接节点递归调用前,先检查它是否已在栈中 → 是则直接返回“有环”
  • 递归返回后,从栈中移除当前节点

这种方法逻辑更直观,适合调试和教学,时间开销与三色法一致,都是 O(V + E)。

java-enterprise
java-enterprise

Java企业开发专家,专注于Spring Boot、微服务架构和JVM优化。适用于:Java语言掌握、

下载

需遍历所有起点

有向图可能不连通,单次DFS可能覆盖不到全部节点:

  • 要对每个未访问过的节点都启动一次DFS
  • 只要任意一次DFS中检测到灰色邻接点,即可提前终止并判定有环
  • 若所有节点都走完且没触发环条件,说明图无环

注意:不能只从入度为0的节点开始(有些环可能孤立,如自环 3→3 或纯环 1→2→1),必须全覆盖。

实际编码关键细节

写代码时容易出错的地方:

  • 状态更新顺序:访问节点 → 标灰 → 遍历邻居 → 回溯前标黑,不能颠倒
  • 邻接表遍历中,不要跳过已标黑的节点(那是正常终止),只对灰节点敏感
  • 自环(v→v)属于最短环,DFS中访问自己时立刻能捕获(v 的邻接列表含 v,且 v 此时是灰)
  • 语言层面注意递归栈深度,大规模图建议用迭代DFS+显式栈避免爆栈

不复杂但容易忽略

热门AI工具

更多
二狗PPT
二狗PPT Hot

一款AI演示文稿工具,主要用于专为中式职场打造的AI PPT生成工具,适合需要提升相关任务效率的用户。

PixPix
PixPix Hot

PixPix是一款面向电商视觉生产的AI商品图生成工具。

切问学术

切问学术是一款AI论文写作工具,复旦大学NLP团队推出的AI学术智能体。

PixTV
PixTV Hot

PixTV是一款面向AIGC内容创作的AI视频生成工具。

Laper
Laper Hot

Laper是专为编剧、导演和制片人推出的 AI 原生剧本创作工具。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

墨刀AI
墨刀AI Hot

一款AI图像与设计工具,主要用于产品经理的专属智能体,适合需要提升相关任务效率的用户。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

相关专题

更多
treenode的用法
treenode的用法

​在计算机编程领域,TreeNode是一种常见的数据结构,通常用于构建树形结构。在不同的编程语言中,TreeNode可能有不同的实现方式和用法,通常用于表示树的节点信息。更多关于treenode相关问题详情请看本专题下面的文章。php中文网欢迎大家前来学习。

2481

2023.12.01

C++ 高效算法与数据结构
C++ 高效算法与数据结构

本专题讲解 C++ 中常用算法与数据结构的实现与优化,涵盖排序算法(快速排序、归并排序)、查找算法、图算法、动态规划、贪心算法等,并结合实际案例分析如何选择最优算法来提高程序效率。通过深入理解数据结构(链表、树、堆、哈希表等),帮助开发者提升 在复杂应用中的算法设计与性能优化能力。

356

2025.12.22

深入理解算法:高效算法与数据结构专题
深入理解算法:高效算法与数据结构专题

本专题专注于算法与数据结构的核心概念,适合想深入理解并提升编程能力的开发者。专题内容包括常见数据结构的实现与应用,如数组、链表、栈、队列、哈希表、树、图等;以及高效的排序算法、搜索算法、动态规划等经典算法。通过详细的讲解与复杂度分析,帮助开发者不仅能熟练运用这些基础知识,还能在实际编程中优化性能,提高代码的执行效率。本专题适合准备面试的开发者,也适合希望提高算法思维的编程爱好者。

397

2026.01.06

C++ 数据结构与算法实现教程合集
C++ 数据结构与算法实现教程合集

以 C++ 为实现语言,系统讲解核心数据结构与算法,涵盖链表(单链表/双链表/环检测)、栈与队列(单调栈/优先队列)、二叉树(遍历/BST/AVL/红黑树)、哈希表(开地址法/链地址法)、图(邻接表/BFS/DFS/Dijkstra/拓扑排序)、常见排序算法(快排/归并/堆排/计数排序)的实现与复杂度分析,同时分享 LeetCode 刷题技巧、竞赛编程常用模板(二分/前缀和/滑动窗口/动态规划),帮助开发者夯实算法基础。

452

2026.05.09

Revel框架入门与安装配置
Revel框架入门与安装配置

本专题从Revel框架环境搭建讲起,系统介绍命令行工具安装、项目创建、目录结构、配置文件及热代码重载,帮助开发者快速完成首个Go Web应用。

0

2026.10.16

Linux 新手先学哪些命令
Linux 新手先学哪些命令

Linux新手命令专题汇集终端基础、文件目录操作、文本查看、软件安装和权限管理等入门文章,帮助按实际任务练习常用命令并建立命令行操作习惯。

0

2026.10.15

MySQL 忘记密码怎么办
MySQL 忘记密码怎么办

MySQL忘记密码专题汇集不同版本与系统下的root密码重置方法,覆盖MySQL 5.7、8.0、Mac、Linux及本地集成环境,并提示恢复权限与重新登录的检查步骤。

0

2026.10.15

Vue.js 中 ref 和 reactive 的区别
Vue.js 中 ref 和 reactive 的区别

Vue.js中ref和reactive的区别专题汇集两种响应式API的定义、访问方式、对象解构、侦听与性能取舍等文章,帮助结合实际状态类型选择合适写法。

0

2026.10.15

VS Code 怎么配置开发环境
VS Code 怎么配置开发环境

VS Code开发环境专题汇集编辑器安装、语言扩展、编译器、解释器、终端和调试配置文章,覆盖Java、Python、C++和PHP等常见语言的入门设置。

0

2026.10.15

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
dev.java 官方:Learn Java
dev.java 官方:Learn Java

共0课时 | 0人学习

Java JDBC数据库连接官方教程
Java JDBC数据库连接官方教程

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn