我编写了一个函数,用于计算是否可以使用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;
}
答案 0 :(得分:1)
BFS有两个部分是您缺失的。 BFS用于查找节点之间的路径,但它也尝试查找最短路径(但仅查找已搜索的节点),因此通常会涉及成本值。由于您只关心节点是否已连接,因此您不需要此成本值。
缺少的第二部分是跟踪从队列通向当前节点的父节点。请参阅此处编写的伪代码:https://en.wikipedia.org/wiki/Breadth-first_search请注意它们对n.parent和n.distance的使用。
在另一个数据结构中跟踪当前节点的父引用,或者在Node对象内添加指向父节点的指针。然后,一旦当前节点等于目标节点,您就可以将父节点指针向后追溯到起始节点。这将为您提供从完成节点到起始节点的完整路径。
如果您想要从开始到结束的路径,您需要遍历父节点并在列表或其他内容中存储对它们的引用,并在您&#39时反转列表;完成。
答案 1 :(得分:0)
所以你得到了你的bfs算法,但无法检索实际路径。您需要做的就是搜索是否已经回答了相同的问题before。