使用BFS的2个节点之间的路径

时间:2016-03-01 18:42:17

标签: java graph breadth-first-search

我编写了一个函数,用于计算是否可以使用BFS从源顶点访问目标顶点。现在我需要跟踪我用来到达顶点的路径。我想这应该是一个小调整,我们可以将节点添加到我的路径arraylist。有人请帮帮我。

public Boolean isReachable(Node destination) {
    ArrayList<Node> visited = new ArrayList<>();
    LinkedList<Node> queue = new LinkedList<>();
    ArrayList<Node> path = new ArrayList<>();
    queue.add(this);

    while (queue.size() != 0) {
        Node source = queue.poll();

        for (Node node : source.adjacentNodes) {
            if (node.equals(destination))
                return true;

            if (!visited.contains(node)) {
                visited.add(node);
                queue.add(node);
            }

        }
    }
    return false;
}

2 个答案:

答案 0 :(得分:1)

BFS有两个部分是您缺失的。 BFS用于查找节点之间的路径,但它也尝试查找最短路径(但仅查找已搜索的节点),因此通常会涉及成本值。由于您只关心节点是否已连接,因此您不需要此成本值。

缺少的第二部分是跟踪从队列通向当前节点的父节点。请参阅此处编写的伪代码:https://en.wikipedia.org/wiki/Breadth-first_search请注意它们对n.parent和n.distance的使用。

在另一个数据结构中跟踪当前节点的父引用,或者在Node对象内添加指向父节点的指针。然后,一旦当前节点等于目标节点,您就可以将父节点指针向后追溯到起始节点。这将为您提供从完成节点到起始节点的完整路径。

如果您想要从开始到结束的路径,您需要遍历父节点并在列表或其他内容中存储对它们的引用,并在您&#39时反转列表;完成。

答案 1 :(得分:0)

所以你得到了你的bfs算法,但无法检索实际路径。您需要做的就是搜索是否已经回答了相同的问题before