0

0

c++如何实现深度优先搜索_c++图论算法DFS【进阶】

穿越時空

穿越時空

发布时间:2026-02-08 11:02:57

|

360人浏览过

|

来源于php中文网

原创

应改用迭代DFS:用std::stack存节点和邻接索引,避免系统栈溢出;邻接表优选vector(cache友好、预留空间);有向图判环需三态visited数组;多源DFS共用全局状态数组并合理初始化。

c++如何实现深度优先搜索_c++图论算法dfs【进阶】

DFS 递归实现时溢出怎么办

图太大或深度太深时,std::stack 手写迭代版反而更稳,但多数人直接写递归,一跑大图就 SIGSEGVstack overflow。这不是代码错,是系统栈默认太小(Linux 通常 8MB,Windows 更小)。

  • 临时扩栈:Linux 下编译加 -Wl,--stack=32*1024*1024(32MB),但不解决根本问题
  • 真正可靠的是改用迭代 DFS:用 std::stack 存节点和当前邻接索引,避免重复遍历边
  • 注意别把整条路径压栈——只压 nodenext_edge_index,否则内存爆炸

邻接表里用 vector 还是 list 存边

std::vector<:vector>> 是主流,但不是因为“快”,而是因为 cache 友好 + 随机访问需要。DFS 遍历邻接点时,for (int v : graph[u]) 的局部性远好于 list 的指针跳转。

  • vector 插入慢?DFS 建图一般只做一次,后续全是读,不用纠结
  • 如果图动态变化频繁(如删边),vector 删除成本高,但 DFS 本身不支持边删除——得先确认你真需要这个能力
  • vector 时记得预留空间:graph[u].reserve(degree[u]),避免多次 realloc

DFS 判断环时 visited 数组怎么设状态

只用 bool visited[] 只能判无向图的简单环,有向图必须区分「未访问」「访问中」「已访问完」三种状态,否则会漏判或误判。

  • 状态值推荐用 enum { UNVISITED = 0, VISITING = 1, VISITED = 2 },别用 magic number
  • 遇到 VISITING 就说明有向环;遇到 VISITED 直接跳过——这是剪枝关键
  • 别在递归返回时清 VISITING 状态:那是拓扑排序才做的事,DFS 找环不需要

多源 DFS 怎么避免重复访问同一节点

多个起点同时开始 DFS?常见于连通分量计数、洪水填充变种。错误做法是每个起点单独跑一遍 DFS 并重置 visited 数组——效率低还逻辑错。

快剪辑
快剪辑

国内⼀体化视频⽣产平台

下载

立即学习C++免费学习笔记(深入)”;

  • 统一用一个全局 visited 数组,所有源点入栈/队列前先检查是否已标记
  • 如果需区分各源点影响范围(比如染色),用 color[] 替代布尔值,初始为 -1,每轮 DFS 用不同颜色值
  • 注意初始化顺序:先全填 -1,再把所有源点 push 进栈并设对应 color,再开始 while 循环

DFS 的边界细节比算法框架更耗时间:栈大小、状态编码、内存布局、多源同步——这些地方一错,调试半天都看不出哪行逻辑有问题。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
while的用法
while的用法

while的用法是“while 条件: 代码块”,条件是一个表达式,当条件为真时,执行代码块,然后再次判断条件是否为真,如果为真则继续执行代码块,直到条件为假为止。本专题为大家提供while相关的文章、下载、课程内容,供大家免费下载体验。

98

2023.09.25

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

626

2023.08.02

int占多少字节
int占多少字节

int占4个字节,意味着一个int变量可以存储范围在-2,147,483,648到2,147,483,647之间的整数值,在某些情况下也可能是2个字节或8个字节,int是一种常用的数据类型,用于表示整数,需要根据具体情况选择合适的数据类型,以确保程序的正确性和性能。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

552

2024.08.29

c++怎么把double转成int
c++怎么把double转成int

本专题整合了 c++ double相关教程,阅读专题下面的文章了解更多详细内容。

173

2025.08.29

C++中int的含义
C++中int的含义

本专题整合了C++中int相关内容,阅读专题下面的文章了解更多详细内容。

205

2025.08.29

堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

404

2023.07.18

堆和栈区别
堆和栈区别

堆(Heap)和栈(Stack)是计算机中两种常见的内存分配机制。它们在内存管理的方式、分配方式以及使用场景上有很大的区别。本文将详细介绍堆和栈的特点、区别以及各自的使用场景。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

584

2023.08.10

overflow什么意思
overflow什么意思

overflow是一个用于控制元素溢出内容的属性,当元素的内容超出其指定的尺寸时,overflow属性可以决定如何处理这些溢出的内容。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

1786

2024.08.15

Golang处理数据库错误教程合集
Golang处理数据库错误教程合集

本专题整合了Golang数据库错误处理方法、技巧、管理策略相关内容,阅读专题下面的文章了解更多详细内容。

39

2026.02.06

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PostgreSQL 教程
PostgreSQL 教程

共48课时 | 8.7万人学习

Git 教程
Git 教程

共21课时 | 3.4万人学习

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

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号