You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用深度优先搜索(DFS)检测有向图中的多个重叠环?

用改进版DFS检测有向图中的重叠环

嘿,我来帮你理清如何用改进的DFS找出有向图里的所有重叠环~你已经熟悉的WHITE/GREY/BLACK颜色标记是核心基础,我们只需要在这个基础上追踪当前递归路径,就能捕获所有重叠的环。

核心原理

常规DFS用颜色标记检测环的逻辑是:遇到灰色节点说明存在环,但要收集所有重叠环,我们需要额外维护一个当前路径栈,记录从起点到当前节点的完整路径:

  • WHITE:节点未被访问过
  • GREY:节点正在当前递归栈中(处于访问中)
  • BLACK:节点已被完全处理(所有子节点都遍历完毕)
  • 当遍历到一个灰色节点时,说明这个节点已经在当前路径里了——从该灰色节点到当前节点的路径,加上当前节点指向它的边,就是一个完整的环。
  • 递归回溯时,要把当前节点从路径栈中移除,并标记为BLACK,这样才能探索其他分支的环(这也是能捕获重叠环的关键)。

伪代码

// 全局/类级变量
color[]: 每个节点的颜色,初始为WHITE
currentPath: 栈,记录当前递归路径中的节点
allCycles: 列表,存储所有找到的环

function dfs(node):
    color[node] = GREY
    push node to currentPath
    
    for each neighbor in adjacencyList[node]:
        if color[neighbor] == WHITE:
            dfs(neighbor)
        elif color[neighbor] == GREY:
            // 找到环:从neighbor到当前node的路径就是环
            cycle = 从currentPath中找到neighbor的位置,截取到当前node的部分,再加上neighbor
            add cycle to allCycles
    
    // 回溯:标记为已处理,移出当前路径
    color[node] = BLACK
    pop node from currentPath

// 启动遍历(假设图是连通的,若不连通则遍历所有未访问节点)
for each node in allNodes:
    if color[node] == WHITE:
        dfs(node)

针对你的场景说明

以你给出的图为例,当从节点1出发DFS时:

  • 走到节点2后,会探索分支3和7,每一条分支遇到指向灰色节点(比如5指向1)时,就会截取路径生成环;
  • 回溯后处理节点8的分支时,同样会捕获另外4个环,最终收集到全部8个重叠环。

内容的提问来源于stack exchange,提问作者Ashish Bhagavatula

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 08:43:11