问题描述
我想计算2个节点之间的最短路径。每个节点的位置类似[1,2]。当我使用BFS遍历节点时,我将每个节点标记为已访问,并增加与起始节点的距离。找到结束节点后,我想调用一个函数,传递开始和结束节点并获得最短路径
输入:
bottom navigation view
所需的输出:
[3,3],[5,6],[all visited] (output included in all visited)
如何过滤所有访问者以获取最短路径?
解决方法
如果我的理解正确,您是在问如何从找到目标的广度优先搜索中重建最短路径。
有多种方法可以执行此操作,但是一种方法是将您访问过的标记转换为带有对您来自的节点的反向引用的标记。
在Wikipedia上,您可以找到伪代码,其中该反向引用是节点的parent
属性:
procedure BFS(G,root) is let Q be a queue label root as discovered Q.enqueue(root) while Q is not empty do v := Q.dequeue() if v is the goal then return v for all edges from v to w in G.adjacentEdges(v) do if w is not labeled as discovered then label w as discovered w.parent := v Q.enqueue(w)
尽管您可以为“ visited”(或“ discovered”)保留一个单独的布尔标志,但是您可以通过使用此parent
属性来节省空间:如果该属性为非null,请将该节点视为已访问
找到目标节点后,您可以通过parent
后向引用属性向后走,直到到达起始节点。像这样往回走的过程并不难:
if v is the goal then
let path be a stack
path.push(v)
while v is not the root do
v := v.parent
path.push(v)
return path
请注意,根据path
使用的实际数据结构,您可能需要将其反转。