Huffuman树

问题描述

Huffman树在编码中有着广泛的应用。在这里,我们只关心Huffman树的构造过程。给出一列数{pi}={p0, p1, …, pn-1},用这列数构造Huffman树的过程如下:
1、找到{pi}中最小的两个数,设为pa和pb,将pa和pb从{pi}中删除掉,然后将它们的和加入到{pi}中。这个过程的费用记为pa + pb。
2.、重复步骤1,直到{pi}中只剩下一个数。
在上面的操作过程中,把所有的费用相加,就得到了构造Huffman树的总费用。
本题任务:对于给定的一个数列,现在请你求出用该数列构造Huffman树的总费用。

代码

应用优先队列可以较为简单的解决

#include 
using namespace std;
priority_queue<int,vector<int>,greater<int> >vis;
int main()
{
    int n;
    cin>>n;
    for(int i=0;i<n;i++)
    {
        int x;
        cin>>x;
        vis.push(x);
    }
    int res=0;
    while(vis.size()>=2)
    {
        int a=vis.top();
        vis.pop();
        int b=vis.top();
        vis.pop();
        vis.push(a+b);
        res=res+a+b;
    }
    cout<<res<<endl;
    return 0;
}

你可能感兴趣的:(蓝桥杯,算法,数据结构,队列,蓝桥习题答案,c++,谭浩强)