关于【哈夫曼树】
为了方便快捷高效率的求得集合中权值最小的2个元素,我采用堆数据结构,它可以以O(logn)的复杂度取得n个元素中的最小值。为了绕过对堆的实现,我采用标准模板库中的相应标准模板——优先队列。 利用语句: priority_queue<int> Q; 建立一个保存元素为int的堆Q,但是此时建立的堆默认是大顶堆,即每次取到的元素是整个堆中的最大元素,于是采用如下语句定义一个小顶堆: priority_queue<int,vector<int>,greater<int> >Q; 关于堆的有关操作如下: Q.push(x); 将元素x放入堆Q中。 int a=Q.top(); 取出堆顶元素,即最小的元素保存在a中。 Q.pop(); 弹出堆顶元素,弹出后堆会自动调整为一个新的小顶堆。 题目1172:哈夫曼树 题目描述: 哈夫曼树,第一行输入一个数n,表示叶结点的个数。需要用这些叶结点生成哈夫曼树,根据哈夫曼树的概念,这些结点有权值,即weight,题目需要输出所有结点的值与权值的乘积之和。 输入: 输入有多组数据。 每组第一行输入一个数n,接着输入n个叶节点(叶节点权值不超过100,2<=n<=1000)。 输出: 输出权值。 样例输入: 5 1 2 2 5 9 样例输出: 37代码如下: #include <iostream> #include <queue> using