簡體   English   中英

優先隊列和Prim算法

[英]Priority queue and Prim's Algorithm

我已經閱讀了C ++參考手冊,目前還不清楚如何在STL中使用priorityqueue數據結構。

所以,基本上我一直在嘗試使用堆來實現自己的。

我這樣做是為了實現Prim的算法。

Vector <int, int> pq;

這是我的優先隊列。 第一個字段是節點,第二個字段是現有樹的權重。

我計划每次通過更新其鄰居節點的權重將新節點添加到樹中時修改pq中的權重值。

  • 如何訪問此向量的各個元素? 我還需要能夠隨意刪除元素。

這是實現優先級隊列的好方法嗎? 如果我想在容器中添加另一個字段,即

Vector<int, int, int> MST
  • 我如何訪問第三個元素? 我希望以這種方式存儲生成的MST,使得前兩個字段表示形成邊緣的頂點,第三個字段表示權重。

如果有人能告訴我如何使用push_back為這個向量分配元素,這也會有所幫助。

  • 此外,傳統的C ++ STL優先級隊列是否有助於此,因為每次將新元素添加到MST時我需要更新優先級值? 當值被修改時,它會根據優先級自我糾正嗎?

  • 另外一個問題,這些向量,當我將它們傳遞給函數,並嘗試進行更改時,它是值傳遞還是通過引用傳遞 - 或者,更改是否反映在函數外部?

在Prim的算法中,隨機訪問不需要的元素。 您只需要跳過連接已連接並向前傳遞的隊列中的元素。

所以算法如下:

  1. 選擇一個節點N
  2. N中的所有邊添加到PQ
  3. 從PQ中獲得最低成本優勢
    • 如果它連接已在樹中的節點,則跳過它
    • 否則將此邊添加到樹中,調用新節點N並返回到第2點。

添加節點后,只需檢查樹的size of graph - 1是否已經size of graph - 1 如果是,那么完成。

請注意,PQ上的唯一操作是add_elementpop_minimum - 因此std::priority_queue將起作用。

首先, std::vector<int,int>無效 - 第二個類型參數是(可選)分配器,而int不是分配器。 如果您使用的是不同的底層容器,請說明它是什么。 我假設你現在想要使用std::vector

其次, std::priority_queue不支持您想要的操作(訪問和刪除任意元素),因此您無法使用它。

您可以直接使用底層向量,並使用堆算法( std::make_heap等)對其進行排序:

  • 隨機訪問將起作用(雖然一旦你的向量處於堆順序,你不希望索引是什么)
  • 刪除任意元素將需要從向量中刪除它並重新運行make_heap,或者您可以實現自己的siftDown

哦,你可以在你的矢量中存儲一些值類型,例如

std::vector<std::pair<int,int>>

對於你的第一個例子,或者可能更清楚:

struct {
  int node;
  int weight;
} Node;
// ...
std::vector<Node>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM