对象:有向图
思路:使用visit标记已访问的节点。若在深度遍历过程中访问到已访问过的点,这返回1;反之返回0.
//G表示有向图, n表示节点数
bool DFS_all(graph &G, int n) {
bool visit[n] = {false};
for (int i = 0; i < n; i++) {
if (!visit[i] && DFS(G, i, n, visit)) return true;
}
return false;
}bool DFS(graph &G, int node, int n, bool visit[]) {
visit[node] = true;
for (int i = 0; i < n; i++) {
if (G[node][i] == 1) {
if (visit[i]) {
return true; // Found a cycle
} else if (!visit[i] && DFS(G, i, n, visit)) {
return true; // Cycle found in the recursive call
}
}
}
visit[node] = false; // 重置,检查下一个连通分量是否有环
return false;
}