我正在开发一个图库,需要确定两个节点是否连接,如果连接,它们之间的分离程度是多少 即从源节点到达目标节点所需的节点数。
由于它是非加权图,因此bfs给出最短路径。但是如何在到达目标节点之前跟踪发现的节点数量。
在发现新节点时递增的简单计数器将给出错误的答案,因为它可能包括甚至不在路径中的节点。
另一种方法是将此视为均匀加权边的加权图并使用Djkastra的最短路径算法。
但我只想用bfs管理它。
怎么做?
答案 0 :(得分:2)
在BFS期间,让每个节点存储指向其前任节点的指针(图中的节点沿着其边缘首先发现节点)。然后,一旦运行BFS,就可以重复跟踪从目标节点到源节点的指针。如果计算这需要的步数,您将获得从目标到源节点的距离。
或者,如果您需要重复确定节点之间的距离,您可能需要使用Floyd-Warshall全对最短路径算法,如果预先计算,则可以让您立即读取任何节点对之间的距离。 / p>
希望这有帮助!
答案 1 :(得分:2)
我不明白为什么一个简单的计数器不起作用。在这种情况下,广度优先搜索肯定会给你最短的路径。所以你想要做的是将一个属性附加到名为'count'的每个节点。现在,当您遇到尚未访问过的节点时,您将使用当前计数填充'count'属性并继续。
如果稍后再回到节点,您应该通过填充的计数属性知道它已被访问过。
编辑 :要在此处扩展我的答案,您必须维护一个变量,该变量将跟踪您与起始节点的分离程度浏览图表。对于加载到队列中的每个新子集,请确保增加该变量中的值。
答案 2 :(得分:0)
如果您只想知道距离(如果距离太大,可能会切断搜索),并且所有边都具有相同的权重(即1):
伪代码:
Let Token := a new node object which is different from every node in the graph.
Let Distance := 0
Let Queue := an empty queue of nodes
Push Start node and Token onto Queue
(Breadth-first-search):
While Queue is not empty:
If the head of Queue is Target node:
return Distance
If the head of Queue is Token:
Increment Distance
Push Token onto back of the Queue
If the head of Queue has not yet been seen:
Mark the head of the Queue as seen
Push all neighbours of the head of the Queue onto the back of Queue
Pop the head of Queue
(Did not find target)