【模板】哈夫曼树构造
2017-06-12 18:03
218 查看
题目描述:
构造哈夫曼树:给出一列数,构造一棵二叉树,分别以这些点为叶子的权值,使所有叶子的权值和它到树根的距离(边数)的乘积之和为最小。
第一行一个正整数n
第二行n个整数
所有叶子的权值和它到树根的距离(边数)的乘积之和的最小值
4
4 2 7 1
样例输出:
24
构造哈夫曼树:给出一列数,构造一棵二叉树,分别以这些点为叶子的权值,使所有叶子的权值和它到树根的距离(边数)的乘积之和为最小。
输入格式:
第一行一个正整数n第二行n个整数
输出格式:
所有叶子的权值和它到树根的距离(边数)的乘积之和的最小值
样例输入:
44 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; }
相关文章推荐
- ecshop模板教程-模板构造
- 数据结构图文解析之:哈夫曼树与哈夫曼编码详解及C++模板实现
- 构造哈夫曼树的Java实现,未通过亲自编程实现,记一下。
- 哈夫曼树的建立和哈夫曼编码的构造
- 数据结构-----哈夫曼树的构造以及遍历
- 51Nod 1117 聪明的木匠 (优先队列构造哈夫曼树)
- 数据结构学习笔记(三) 树形结构之利用堆构造哈夫曼树
- 哈夫曼树的构造
- poj3177Redundant Paths【构造双连通分量:并查集缩点 模板】
- 构造哈夫曼树
- 数据结构-哈夫曼树的构造(1)
- 哈夫曼树与哈夫曼编码详解及C++模板实现
- 数据结构-----哈夫曼树的构造以及遍历
- 构造哈夫曼树
- 哈夫曼树的构造以及编码实现
- hdu 5884- Sort 哈夫曼树构造 + 模拟优先队列 + 二分
- [模板]哈夫曼树
- POJ 3253 Fence Repair(优先队列构造哈夫曼树)
- 哈夫曼树,及哈夫曼编码的构造