哈夫曼树的建立问题,建立哈夫曼树的过程很简单,每次在集合k中取出两个权制最小的点进行合并,并将合并之后的结果放入集合k中即可。因此问题的关键就在于怎样快速简便的从集合k中找出两个权值最小的结点。
我们可以使用优先队列解决。priority_queue<int> Q 建立一个int型的大顶堆,priority_queue< int,vector<int>,greater<int> > Q 建立一个int型的小顶堆,每次取出或者加入元素时,堆会自动进行调整。
#include <iostream>
#include <queue>
using namespace std;
int main()
{
int n;
while (cin >> n)
{
int cost = 0;
priority_queue<int,vector<int>,greater<int> > str;
for (int i = 0;i < n;i++)
{
int m;
cin >> m;
str.push(m);
}
for (int i = 1;i < n;i++)
{
int s,t;
s = str.top();
str.pop();
t = str.top();
str.pop();
s += t;
cost += s;
str.push(s);
}
cout << cost << endl;
}
}