如何在C ++中跟踪BFS深度

时间:2016-12-22 04:03:46

标签: c++ algorithm breadth-first-search

我想在2D阵列上进行BFS,每个单元格都可以表示为pair<int,int>。我使用queue<pair<int,int>>来跟踪每个级别的单元格,但我发现没有一种聪明的方法可以跟踪深度。 (我不想定义另一个结构来记录每个级别的深度)

How to keep track of depth in breadth first search? 这是Java的解决方案。每个级别都以null结束,一旦我们看到null,我们就会增加深度。

我想知道在C ++中是否有类似优雅的解决方案。现在,我可以想到以下几种方式:

1)计算每个级别的单元格数(push()),并在每个pop()之后减少计数。 count == 0后,请增加深度。

2)使用两个queue并在每个级别的末尾用新的替换旧的pair<int,int>。在每次迭代结束时增加深度。

3)可能会在队列中存储指向NULL的指针并使用javascript分隔级别?

2 个答案:

答案 0 :(得分:0)

在精神上类似于将null插入队列的解决方案是仅插入不可能作为单元格出现的sentinel值。例如。 $(document).ready(function () { $("#dropDownUl li").on('click', function () { $('#dropDownBtn').text($(this).text()); }); });

答案 1 :(得分:0)

(1)可以工作,但是设置count = queue.size()会更好/更容易,并且每次弹出时都会减少它。当它变为0时,增加深度并再次设置count = queue.size()。

(2)工作正常。使用std :: swap切换队列。这就是我通常所做的,因为我喜欢外部<div class="parent"> <div class="child"> <div id='green'> </div> <div id="orange"></div> <div class="clear"> </div> </div> </div>你也可以使用向量而不是真实的队列,因为你不是在同一个对象上推动和弹出。第二级循环只是通过向量的迭代。

(3)有效,但很浪费。其他类型的标记值可以起作用,但我认为上面的(1)在所有情况下都比这更好。

如果您更喜欢使用std :: deque而不是两个向量,我喜欢这样写:

for(int depth=0; !newnodes.empty(); ++depth)

...这与我上面的(1)非常相似,但是我得到了很好的深度循环,并且通过在queue.push_back(root); for (int depth=0; !queue.empty(); ++depth) { for (size_t remaining=queue.size(); remaining>0; --remaining) { auto item = queue.pop_front(); //.... queue.push_back(...), etc. } } 上编写循环条件,我们可以避免对{{1}进行任何其他内循环检查}