2013-03-08 21 views
1

我正在查看一个图形问题,其中给出了一个源节点,并且需要查找距离固定的所有其他节点,其中节点之间的每个边都具有统一的成本。因此,我使用标准的FIFO队列技术实现了宽度优先的搜索,但是以固定距离停止BFS会导致问题。具有固定停止距离的宽度优先搜索

如果我使用DFS,我可以在每个递归调用中传递当前深度,但是我不能在这里做到这一点。我无法修改图的节点以保留额外的参数(距离)。任何建议或参考?

回答

2

只需使用两个队列并在它们之间来回跳动。每次你从一个切换到另一个时,你的深度计数加1。

要精心...

保持“活动”队列和“无效”的队列。

从活动队列中弹出一个节点。将其邻居添加到不活动的队列中。重复,直到活动队列为空。然后交换队列。

这保持不变,即如果到活动队列中所有节点的距离为d,则到非活动队列中所有节点的距离为d+1。足够容易跟踪和停止,当你想要的。

+0

这听起来不错。所以基本上,第一个队列保存距离为d的边界上的所有节点,而另一个队列保存下一个边界。我查看了我的算法教科书,但找不到这种方法。谢谢。 – stackoverflowuser2010 2013-03-08 22:01:33

+0

不客气。如果你喜欢我的回答,你可以考虑投票和/或接受它:-) – Nemo 2013-03-09 15:32:37

1

您可以将深度传递给您放入队列中的值。您还可以保留一个单独的阵列来存储您到达每个节点的深度。

0

将您传递的顶点与距离BFS源的距离一起进行封装。

另一种可能性是只标记队列中的顶点;通常用于图表的框架允许您为图表的元素分配权重,这是您可以用于您的目的的一种机制。

最后一种可能性是在BFS的一个层次的边界已经完全处理之后,将实际上不在图中的标记顶点插入队列中,以便知道何时开始新的BFS深度级别。这将使你的队列看起来像v u w x y MARKER s t j l k,所有这些都是图的顶点,除了MARKER

+0

浪费内存来创建另一个数据结构来包裹每个顶点? – stackoverflowuser2010 2013-03-08 23:57:33

+0

@ stackoverflowuser2010用两种可能性编辑我的答案。 – 2013-03-09 00:22:27