判断有向图是否有回路的核心方法是:通过拓扑排序检测是否存在无法完成排序的顶点(即存在环),或使用深度优先搜索(DFS)过程中检查是否出现后向边。
-
拓扑排序法
拓扑排序能将有向无环图(DAG)的顶点排成线性序列。若图中存在回路,则无法完成拓扑排序:- 统计每个顶点的入度,将入度为0的顶点加入队列。
- 依次处理队列中的顶点,减少其邻接顶点的入度。若某顶点入度降为0则加入队列。
- 若最终处理的顶点数少于总数,说明剩余顶点构成回路。
-
深度优先搜索(DFS)法
在DFS遍历时,若发现某顶点的邻接顶点处于当前递归栈中(即存在后向边),则存在回路:- 为每个顶点标记三种状态:未访问、访问中、已访问。
- 递归访问顶点时,若遇到“访问中”的邻接顶点,说明存在回路。
- 完成访问后标记为“已访问”,避免重复判断。
-
应用场景对比
- 拓扑排序适合需要输出顶点顺序的场景(如任务调度)。
- DFS更适合动态检测或需定位具体回路的场景。
提示:实际应用中可根据需求选择方法,若仅需判断是否存在回路,DFS通常更高效;若需排序或处理依赖关系,拓扑排序更直观。