java - 测试图中两个节点之间是否存在路径

标签 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;
}

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

最佳答案

对于许多输入图,此代码将进入无限循环。

考虑在边缘为以下情况时查找从 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)

您会发现您错过了检查是否尚未发现新顶点的测试。

关于java - 测试图中两个节点之间是否存在路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37413973/

相关文章:

java - CouchBase-lite - 无法应用管理器中的上下文

algorithm - 壳牌比。希伯德时间复杂度比较

c++ - 是否有一种(文学)算法可将每个传入边缘的节点拆分为一个节点?

graphics - 如何使用 gvmap 更改簇颜色?

java - session 超时

java - RL4J A3C DeepLearning 从网络中抛出的输出不是概率分布

java - 使用 GWT 2.6 将 Java 7 升级到 Java 8

algorithm - 检查二进制字符串中是否有相等的位

algorithm - 多维数据分类

python - matplotlib 怪异,它没有绘制我的图表