先看一個題目:
題目描述
哈夫曼樹,第一行輸入一個數n,表示葉結點的個數。需要用這些葉結點生成哈夫曼樹,根據哈夫曼樹的概念,這些結點有權值,即weight,題目需要輸出哈夫曼樹的帶權路徑長度。
輸入描述:
輸入有多組數據。 每組第一行輸入一個數n,接着輸入n個葉節點(葉節點權值不超過100,2<=n<=1000)。
輸出描述:
輸出帶權路徑長度。
示例1
輸入
5 1 2 2 5 9
輸出
37
這題用到一個結論:
哈夫曼樹的帶權路徑長度 = 非葉子結點的權值之和
一個便於理解這個結論的思路如下:
1 #include <iostream> 2 #include <string> 3 #include <queue> 4 5 using namespace std; 6 7 int a[1010]; 8 9 int main() 10 { 11 12 int n; 13 while(cin >> n) 14 { 15 priority_queue<int, vector<int>, greater<int> > q; 16 for(int i = 0; i < n; ++i) 17 { 18 cin >> a[i]; 19 q.push(a[i]); 20 } 21 22 int ans = 0; 23 while(q.size() > 1) 24 { 25 int a = q.top(); 26 q.pop(); 27 int b = q.top(); 28 q.pop(); 29 ans += a + b; 30 q.push(a+b); 31 } 32 33 cout << ans << endl; 34 35 } 36 37 38 return 0; 39 }