深度优先遍历(DFS)判断图中是否有环的核心方法是:在遍历过程中检测是否存在"回边"(即遇到已访问过且非父节点的顶点)。 通过维护访问状态标记和递归栈,可以高效识别环路的存在。
-
访问状态标记法
使用三种状态标记顶点:未访问(0)、访问中(1)、已访问(2)。当DFS遇到标记为1的顶点时,说明存在反向边,即检测到环。访问中状态记录递归栈内的顶点,完成递归后标记为2。 -
父节点追踪法
在遍历时记录每个顶点的父节点。若发现相邻顶点已被访问过,且不是当前顶点的直接父节点,则存在环。这种方法不需要额外状态标记,但需要存储父节点关系。 -
递归栈检测法
通过显式维护递归栈数组,实时记录当前路径上的顶点。当访问到已存在于递归栈中的顶点时,立即判定存在环。该方法与系统调用栈原理一致,但实现了可视化跟踪。 -
无向图特殊处理
无向图需排除父节点误判:若相邻顶点已访问且非父节点才判定为环。相比有向图,需要额外传递父节点参数以避免双向边的误识别。 -
算法复杂度分析
时间复杂度为O(V+E),与标准DFS一致。空间复杂度主要取决于递归深度,最坏情况下为O(V),可通过迭代实现DFS来优化栈空间。
实际应用中,推荐使用访问状态标记法,兼具代码简洁性和较高执行效率。注意处理图的不连通情况,需对每个连通分量单独执行检测。对于大规模图结构,可结合并查集等数据结构进行优化。