【问题标题】:Breadth first search with fixed stopping distance固定停止距离的广度优先搜索
【发布时间】:2013-03-08 21:11:12
【问题描述】:

我正在研究一个图问题,其中给定了一个源节点,需要找到固定距离内的所有其他节点,其中节点之间的每条边都有统一的成本。因此,我使用标准 FIFO 队列技术实现了广度优先搜索,但是在固定距离处停止 BFS 会给我带来问题。

如果我使用 DFS,我可以在每次递归调用时传入当前深度,但我不能在这里这样做。我也无法修改图形的节点以保留额外的参数(距离)。有什么建议或参考吗?

【问题讨论】:

    标签: algorithm graph breadth-first-search


    【解决方案1】:

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

    详细说明...

    维护一个“活动”队列和一个“非活动”队列。

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

    这保持了如果到活动队列中所有节点的距离是d,那么到非活动队列中所有节点的距离是d+1的不变量。很容易跟踪并在您需要时停止。

    【讨论】:

    • 这听起来很棒。所以基本上第一个队列在距离 d 处保存边界上的所有节点,而另一个队列保存下一个边界。我查看了我的算法教科书,但找不到这种方法。谢谢。
    • 不客气。如果你喜欢我的回答,你可以考虑投票和/或接受它:-)
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      将您通过的顶点及其与 BFS 源的距离封装在一起。

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

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

      【讨论】:

      • 浪费内存来创建另一个数据结构来环绕每个顶点?
      • @stackoverflowuser2010 用另外两种可能性编辑了我的答案。
      猜你喜欢
      • 1970-01-01
      • 2011-01-31
      • 1970-01-01
      • 2018-02-18
      • 1970-01-01
      • 1970-01-01
      • 2016-02-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多