我知道已有类似的问题,但我希望我的搜索方法得到评估。我使用DFS算法来确定两个节点之间是否存在路由。这是我的代码,我想知道是否存在一个测试用例,其中我的代码会因结果而失败。
public boolean routeExists(Node start, Node end) {
Set<Node> visited = new HashSet<>();
Stack<Node> stack = new Stack<>();
visited.add(start);
stack.push(start);
while(!stack.isEmpty()) {
Node current = stack.pop();
if(current.getValue() == end.getValue()) {
return true;
}
for(Node adj : current.getAdjacent()) {
// keep track of visited nodes
if(!visited.contains(adj)) {
stack.push(adj);
visited.add(adj);
}
}
}
return false;
}
我已经进行了编辑,现在代码会跟踪访问过的节点,如果过去访问过这些节点,则不会扩展它们。我相信现在应该可行。
答案 0 :(得分:4)
对于许多输入图,此代码将进入无限循环。
当边缘为:
时,考虑从A到B找到路径A->B
A->C
C->A
您的代码将首先在列表中按B,然后按C,然后访问C并按列表中的A,然后重复直到发生堆栈溢出。
如果您与wikipedia
进行比较1 procedure DFS(G,v):
2 label v as discovered
3 for all edges from v to w in G.adjacentEdges(v) do
4 if vertex w is not labeled as discovered then
5 recursively call DFS(G,w)
您将看到缺少测试以检查是否尚未发现新顶点。