【模板】哈夫曼树构造

来源:互联网 发布:介绍花苗可靠的淘宝店 编辑:程序博客网 时间:2024/06/13 16:04

题目描述:

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

输入格式:

第一行一个正整数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;} 


原创粉丝点击