您的位置:首页 > 理论基础 > 数据结构算法

九度OJ-1172-哈夫曼树

2017-01-30 02:08 246 查看
  由于建立的哈夫曼树不唯一,所以机试多考察哈夫曼树的带权路径长度和,如此题。此问题最终转化为利用堆模拟建树过程,求出非叶节点的权值和(=该哈夫曼树的带权路径长度和)。(无需作出哈夫曼树的具体结构体)

  收获如下:

  ①关于哈夫曼树:该树非叶节点的权值和=该哈夫曼树的带权路径长度和

  ②关于堆排序:堆排序建堆O(n*logn),初始堆完成后,每次重新调整只需O(logn)(树深),故是效率很高的动态排序算法,以后动态排序要想到它(具体分析见王道堆排序)

  ③关于堆模板:即“优先队列”,在<queue>头文件中

    1.大根堆:

priority_queue<类型> Q;


    2.小根堆

priority_queue<类型,vector<类型>,greater<类型> >
//(此处“> >”必须要有空格)(小根堆或可使用该类型比较运算符重载来实现)


    3.其大部分函数与stack模板一致

题目描述:

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

输入有多组数据。

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

输出权值。
样例输入:
5
1 2 2 5 9

样例输出:
37

来源:2010年北京邮电大学计算机研究生机试真题答疑:解题遇到问题?分享解题心得?讨论本题请访问:http://t.jobdu.com/thread-7895-1-1.html
#include <iostream>
#include <queue>
using namespace std;

int main(){
int n;
int k,temp,sum;
priority_queue<int,vector<int>,greater<int> > h;
while (cin>>n){
//initiate
sum=0;
while (!h.empty()){
h.pop();
}
//input
for (int i=0;i<n;i++){
cin>>k;
h.push(k);
}
//process
for (int i=0;i<n-1;i++){
temp=h.top();
h.pop();
temp+=h.top();
h.pop();
sum+=temp;
h.push(temp);
}
//output
cout<<sum<<endl;
}

return true;
}
/**************************************************************
Problem: 1172
User: bit3125
Language: C++
Result: Accepted
Time:10 ms
Memory:1520 kb
****************************************************************/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息