1. 程式人生 > >簡單的哈夫曼樹問題

簡單的哈夫曼樹問題

題目描述:

哈夫曼樹,第一行輸入一個數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;
}