应改用迭代dfs:用std::stack存节点和邻接索引,避免系统栈溢出;邻接表优选vector(cache友好、预留空间);有向图判环需三态visited数组;多源dfs共用全局状态数组并合理初始化。
DFS 递归实现时栈溢出怎么办
图太大或深度太深时,std::stack 手写迭代版反而更稳,但多数人直接写递归,一跑大图就 SIGSEGV 或 stack overflow。这不是代码错,是系统栈默认太小(Linux 通常 8MB,Windows 更小)。
- 临时扩栈:Linux 下编译加
-Wl,--stack=32*1024*1024(32MB),但不解决根本问题 - 真正可靠的是改用迭代 DFS:用
std::stack存节点和当前邻接索引,避免重复遍历边 - 注意别把整条路径压栈——只压
node和next_edge_index,否则内存爆炸
邻接表里用 vector 还是 list 存边
用 std::vector<: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[] 只能判无向图的简单环,有向图必须区分「未访问」「访问中」「已访问完」三种状态,否则会漏判或误判。