java 深度优先搜索

标签 java depth-first-search

这是我使用深度优先搜索对图的reachable() 的实现。它寻找从顶点 1 (v1) 到另一个顶点 (v2) 的可能路径 我得到的结果有些是正确的,有些是错误的。我已经尝试了很多方法来调试,但我无法找出问题所在。任何帮助表示赞赏。谢谢

public boolean isReachable(V v1, V v2) {
            Stack<V> path = new Stack<V>();
            return isReachableHelper(v1, v2, path);
        }

}

public boolean isReachableHelper(V v1, V v2, Stack<V> path){
        path.push(v1);
        v1.setVisited(true); //set the vertex as being visited

        if (v1.vertex().equals(v2.vertex())){ //check whether vertex' values are equal
            return true;
        }

            //loop through all vertex that are neighbors of v1
        for (V neighbor : super.neighbors(v1)){ 
            if (!neighbor.visited ){ //if the neighbor is not visited before
                return isReachableHelper(neighbor, v2, path); //recursive call
            }
        }

        path.pop(); //no path was found
        return false;
    }

最佳答案

问题:在 for 循环中,您只扩展第一个未访问的邻居节点,然后立即返回该递归调用的值。也就是说,如果无法通过 v1 的第一个邻居找到路径,您只需“放弃”而不查看其他邻居。

相反,您必须尝试所有个邻居节点,直到找到递归调用返回true的节点。在这种情况下,你已经找到了一条路径,你可以返回true;否则,您的方法会正确地从路径中弹出最后一个节点并返回 false (回溯)。

for (V neighbor : super.neighbors(v1)){ 
    if (!neighbor.visited ){ //if the neighbor is not visited before
        if (isReachableHelper(neighbor, v2, path)) { //recursive call
            return true; // we found a path!
        }
    }
}

关于java 深度优先搜索,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15420409/

相关文章:

algorithm - 在无向未加权图中查找给定长度的路径数

graph - 检测图中循环的时间复杂度

algorithm - 为什么 DFS 而不是 BFS 用于在图中查找循环

java - 如何在android中对结果进行四舍五入而不失去精度

java - 即使在重置存储库后,代码也很慢 (JavaFX)

java - 如何区分日志文件中的 log4j session 与同一 Web 应用程序的副本?

algorithm - 广度优先搜索与深度优先搜索

java - 如何通过修改结构来反序列化Json?

java - 无法打开 .jar 文件。 JNI 错误。 java.lang.NoClassDefFoundError : org/apache/commons/exec/ExecuteStreamHandler 错误

python - 比较同一字典中的键和值