[英]How to keep track of BFS depth in C++
我想在2D數組上執行BFS,並且每個單元格都可以表示為pair<int,int>
。 我使用queue<pair<int,int>>
來跟蹤每個級別的單元格,但是我找不到跟蹤深度的聰明方法。 (我不想定義另一個結構來記錄每個級別的深度)
如何跟蹤廣度優先搜索的深度? 這是Java中的解決方案。 每個級別以null
,一旦看到null
,我們便增加深度。
我想知道C ++中是否有類似的優雅解決方案。 現在,我可以想到以下幾種方式:
1)計算每個級別的單元格數目( push()
),並在每個pop()
之后減少計數。 一旦count == 0
,請增加深度。
2)使用兩個queue
並在每個級別的末尾用新queue
替換舊queue
。 在每次迭代結束時增加深度。
3)也許在隊列中存儲pair<int,int>
的指針,並使用NULL
來分隔級別?
從本質上講,與在隊列中插入null相似的解決方案是僅插入不可能作為單元格出現的哨兵值。 例如pair<numeric_limits<int>::max(), 0>
(1)可以工作,但設置count = queue.size()並在每次彈出時將其遞減會更好/更容易。 當它變為0時,增加深度並再次設置count = queue.size()。
(2)工作正常。 使用std :: swap切換隊列。 這是我通常執行的操作,因為我喜歡外部for(int depth=0; !newnodes.empty(); ++depth)
您也可以使用向量而不是實際隊列,因為您不會在同一對象。 第二級循環只是向量的迭代。
(3)有效,但是很浪費。 其他種類的標記值也可以使用,但我認為上述(1)在所有情況下都比這更好。
在您更喜歡使用std :: deque而不是兩個向量的情況下,我喜歡這樣寫:
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)非常相似,但是我得到了不錯的深度循環,並通過在remaining
上編寫循環條件,我們可以避免將任何其他內部循環檢查都queue.empty()
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.