[英]Priority queue and Prim's Algorithm
我已經閱讀了C ++參考手冊,目前還不清楚如何在STL中使用priorityqueue數據結構。
所以,基本上我一直在嘗試使用堆來實現自己的。
我這樣做是為了實現Prim的算法。
Vector <int, int> pq;
這是我的優先隊列。 第一個字段是節點,第二個字段是現有樹的權重。
我計划每次通過更新其鄰居節點的權重將新節點添加到樹中時修改pq中的權重值。
這是實現優先級隊列的好方法嗎? 如果我想在容器中添加另一個字段,即
Vector<int, int, int> MST
如果有人能告訴我如何使用push_back為這個向量分配元素,這也會有所幫助。
此外,傳統的C ++ STL優先級隊列是否有助於此,因為每次將新元素添加到MST時我需要更新優先級值? 當值被修改時,它會根據優先級自我糾正嗎?
另外一個問題,這些向量,當我將它們傳遞給函數,並嘗試進行更改時,它是值傳遞還是通過引用傳遞 - 或者,更改是否反映在函數外部?
在Prim的算法中,隨機訪問不需要的元素。 您只需要跳過連接已連接並向前傳遞的隊列中的元素。
所以算法如下:
N
N
中的所有邊添加到PQ N
並返回到第2點。 添加節點后,只需檢查樹的size of graph - 1
是否已經size of graph - 1
。 如果是,那么完成。
請注意,PQ上的唯一操作是add_element
和pop_minimum
- 因此std::priority_queue
將起作用。
首先, std::vector<int,int>
無效 - 第二個類型參數是(可選)分配器,而int不是分配器。 如果您使用的是不同的底層容器,請說明它是什么。 我假設你現在想要使用std::vector
。
其次, std::priority_queue
不支持您想要的操作(訪問和刪除任意元素),因此您無法使用它。
您可以直接使用底層向量,並使用堆算法( std::make_heap
等)對其進行排序:
哦,你可以在你的矢量中存儲一些值類型,例如
std::vector<std::pair<int,int>>
對於你的第一個例子,或者可能更清楚:
struct {
int node;
int weight;
} Node;
// ...
std::vector<Node>
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.