java - 使用 DFS 检测无向图中的循环

标签 java algorithm graph depth-first-search breadth-first-search

<分区>

我正在尝试检测无向图中的循环。我正在使用 DFS 来检测相同的内容。对于任何节点,我都会访问所有连接的节点。如果子节点已经被访问并且它不是当前节点的父节点,那么我们在图中有一个循环。

我写了下面的代码:

public boolean isCyclicUtil(int current, boolean[] visited, int parent, ArrayList<ArrayList<Integer>> adj) {
    visited[current] = true;
    Iterator<Integer> it = adj.get(current).iterator();

    while (it.hasNext()) {
        int nextNode = it.next();
        if (!visited[nextNode]) {
            return isCyclicUtil(nextNode, visited, current, adj);
        } else {
            if (nextNode != parent)
                return true;
        }
    }
    return false;
}

public boolean isCycle(int V, ArrayList<ArrayList<Integer>> adj) {
    boolean[] visited = new boolean[V];
    for (int i = 0; i < V; i++) {
        if (!visited[i] && isCyclicUtil(i, visited, -1, adj)) {
            return true;
        }
    }
    return false;
}

某些测试用例失败。我无法弄清楚代码有什么问题。 请帮助我了解代码中的错误。

最佳答案

不是访问所有相邻顶点,而是在访问第一个由于 return 语句而尚未访问的相邻顶点后停止探索它们:

if (!visited[nextNode]) {
    return isCyclicUtil(nextNode, visited, current, adj);
}

您从单个 isCyclicUtil 执行的搜索空间本质上变成了一条路径,并且不会访问某些顶点。它们当然会在 isCycle 函数中的一些后续迭代中被访问,但它可能是一个很好的练习来理解为什么某些循环可能无法通过这种方式检测到。

修复很容易 - 只有当您确实找到了一个循环时,您才想返回。

关于java - 使用 DFS 检测无向图中的循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67278425/

相关文章:

python-igraph 访问图的特定顶点

graph - 使用向量和对的邻接表图表示

java - 将列表从 JSP 重新填充到 Struts 2 中的操作

java - 创建 Java 应用程序以作为 Windows 服务运行

algorithm - 在数组中只找到两个彼此均分的数字

algorithm - scala中二叉树的最大深度

java - 如何检查圆是否重叠

java - 比较 Hashmap 和 Edittext 的 double 值时遇到问题

java - 无需递归的 Floyd-Warshall 路径重建

c++ - 如何获取两个字符串的所有排列组合?