题目1172:哈夫曼树

来源:互联网 发布:蓝天模具风扇调节软件 编辑:程序博客网 时间:2024/04/27 20:40
题目描述:

哈夫曼树,第一行输入一个数n,表示叶结点的个数。需要用这些叶结点生成哈夫曼树,根据哈夫曼树的概念,这些结点有权值,即weight,题目需要输出所有结点的值与权值的乘积之和。

输入:

输入有多组数据。
每组第一行输入一个数n,接着输入n个叶节点(叶节点权值不超过100,2<=n<=1000)。

输出:

输出权值。

样例输入:
5  1 2 2 5 9
样例输出:
37

代码:

#include <stdio.h>#include <queue>#include <vector>using namespace std;priority_queue<int,vector<int>,greater<int> > Q;int main() {    int n,i;    while(scanf("%d",&n)!=EOF) {        while(Q.empty()==false) Q.pop();        for(i = 0; i<n;i++) {         int x;            scanf("%d",&x);            Q.push(x);        }        int weight = 0;        while(Q.size() > 1) {            int a = Q.top();            Q.pop();            int b = Q.top();            Q.pop();            int c = a + b;            Q.push(c);            weight += c;        }        printf("%d\n",weight);    }    return 0;}            

1.使用堆,可以利用标准库中的优先级队列。包含头文件 #include <queue>

priority_queue<int> Q;
建立一个保存元素类型为int的堆Q,默认建的堆为大顶堆。如果需要小顶堆,可以:

priority_queue<int, vector<int>, greater<int> > Q;
堆的操作:

Q.push(x):  将x放入堆Q中,自动调整为堆。

int a = Q.pop(): 取出堆顶元素放入a中。

Q.pop(): 弹出堆顶元素,取出后自动调整。


2.计算哈夫曼树的带权路径长度,为所有非叶子节点权值之和。

原创粉丝点击