資料結構與演算法題目集7-29——修理牧場
阿新 • • 發佈:2018-12-08
我的資料結構與演算法題目集程式碼倉:https://github.com/617076674/Data-structure-and-algorithm-topic-set
原題連結:https://pintia.cn/problem-sets/15/problems/856
題目描述:
知識點:哈夫曼樹
思路:利用哈夫曼樹計算樹的最小帶權路徑長度
步驟如下:
(1)初始狀態下共有N個節點,節點的權值分別是給定的N個數,將它們視作N棵只有一個節點的樹。
(2)合併其中根節點權值最小的兩棵樹,生成兩棵樹根節點的父節點,權值為這兩個根節點的權值之和,這樣樹的數量就減少了一個。
(3)重複操作(2),直到只剩下一棵樹為止,這棵樹就是哈夫曼樹。
而對於本題,只需計算最小帶權路徑長度即可。
時間複雜度是O(NlogN)。空間複雜度是O(N)。
C++程式碼:
#include<iostream> #include<queue> using namespace std; int N; priority_queue<int, vector<int>, greater<int> > pq; int main(){ scanf("%d", &N); int num; for(int i = 0; i < N; i++){ scanf("%d", &num); pq.push(num); } int result = 0; while(pq.size() > 1){ int num1 = pq.top(); pq.pop(); int num2 = pq.top(); pq.pop(); int num = num1 + num2; pq.push(num); result += num; } printf("%d\n", result); return 0; }
C++解題報告: