簡單的哈夫曼樹問題
阿新 • • 發佈:2018-12-04
題目描述:
哈夫曼樹,第一行輸入一個數N,表示葉結點的個數。需要用這些葉結點生成哈夫曼樹,根據哈夫曼樹的概念,這些結點有權值,即重量,題目需要輸出所有結點的值與權值的乘積之和。
輸入描述:
第一行輸入一個數n,接著輸入n個葉節點(葉結點權值不超過100,2<=n<=1000)。
輸出描述:
輸出權值。
輸入樣例:
5
1 2 2 5 9
輸出樣例:
37
AC程式碼:
#include <bits/stdc++.h> using namespace std; //哈夫曼樹類問題 int main() { priority_queue< int, vector<int>, greater<int> > l; //最小值優先佇列 int n, temp; cin >> n; //輸入結點的個數n for (int i = 0; i < n; i++) { cin >> temp; //輸入n個葉結點 l.push(temp); //葉結點入隊操作 } int sum = 0; while(l.size() != 1) //當結點大小不為1時 { //取出佇列中的最小的元素 int min1 = l.top(); l.pop(); //取出佇列中的次最小的元素 int min2 = l.top(); l.pop(); //計算最小值和次最小值的權值 sum += min1 + min2; l.push(min1+min2); //出佇列 } cout << sum << endl; return 0; }