您的位置:首页 > 其它

【模板】哈夫曼树构造

2017-06-12 18:03 218 查看
题目描述:

构造哈夫曼树:给出一列数,构造一棵二叉树,分别以这些点为叶子的权值,使所有叶子的权值和它到树根的距离(边数)的乘积之和为最小。


输入格式:

第一行一个正整数n
第二行n个整数


输出格式:

所有叶子的权值和它到树根的距离(边数)的乘积之和的最小值


样例输入:

4

4 2 7 1

样例输出:
24


数据范围:n<=10000

#include<iostream>
#include<queue>
#include<cstdio>
using namespace std;
struct XY{int huff,sum;}t[30010];
struct cmp{bool operator()(XY &a,XY &b){return a.sum>b.sum;}};
priority_queue<XY,vector<XY>,cmp> Q;
int sz=0,n,m,next_nm;
int main(){
cin >>n;sz=n;next_nm=n+1;
for (int i=1;i<=n;++i)	cin >>t[i].sum,Q.push(t[i]);

while (sz>1){
XY tmp1=Q.top();Q.pop();
XY tmp2=Q.top();Q.pop();
t[next_nm].huff=tmp1.huff+tmp1.sum+tmp2.huff+tmp2.sum;
t[next_nm].sum=tmp1.sum+tmp2.sum;//用sum可以帮助huff权值的转移
Q.push(t[next_nm]);--sz;++next_nm;
}
cout <<Q.top().huff<<endl;
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: