测试图表中{2}个节点之间是否存在路由

时间:2016-05-24 12:43:30

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

我知道已有类似的问题,但我希望我的搜索方法得到评估。我使用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;
}

我已经进行了编辑,现在代码会跟踪访问过的节点,如果过去访问过这些节点,则不会扩展它们。我相信现在应该可行。

1 个答案:

答案 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)

您将看到缺少测试以检查是否尚未发现新顶点。