这是我使用深度优先搜索的图表的可达()的实现。它寻找从顶点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;
}
答案 0 :(得分:2)
问题:在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!
}
}
}