C++(STL)&&树-堆结构练习——合并果子之哈夫曼树

题目题解:http://blog.csdn.net/xu12110501127/article/details/9199335

有关博客:http://www.360doc.com/content/10/1118/16/963301_70454649.shtml 优先队列不错的博客。

priority_queue 对于基本类型的使用方法相对简单。
他的模板声明带有三个参数,priority_queue<Type, Container, Functional>
Type 为数据类型, Container 为保存数据的容器,Functional 为元素比较方式。
Container 必须是用数组实现的容器,比如 vector, deque 但不能用 list.
STL里面默认用的是 vector. 比较方式默认用 operator< ,

 所以如果你把后面俩个
参数 缺省的话,优先队列就是大顶堆,队头元素最大。

 

如果要用到小顶堆,则一般要把模板的三个参数都带进去。
STL里面定义了一个仿函数 greater<>,对于基本类型可以用这个仿函数声明小顶堆
例子:

复制代码
 1 #include <iostream>
 2 #include <cstdio>
 3 #include <queue>
 4 #include <vector>
 5 #include <algorithm>
 6 #define LL long long
 7 using namespace std;
 8 
 9 struct node
10 {
11     int x, y;
12     bool operator < (const node &tmp)const
13     {
14         return x > tmp.x;
15     }
16 };
17 int main()
18 {
19     priority_queue<int>q1;  //基本类型从大到小
20     priority_queue<int, vector<int>, greater<int> >q2;  //基本类型从小到大
21     priority_queue<node>q3;  //自定义类型
22     return 0;
23 }

http://acm.sdut.edu.cn:8080/vjudge/contest/view.action?cid=203#problem/A
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
#include <queue>
#include <vector>
using namespace std;

int main()
{
    int n,a,sum,sum1;
    long long int count;
    priority_queue<int, vector<int>, greater<int> >q;
    while(scanf("%d",&n)!=EOF)
    {
        count=0;
        for(int i=1; i<=n; i++)
        {
            scanf("%d",&a);
            q.push(a);
        }
        if(n==1)
        {
            printf("%d
",count);
            continue;
        }
        else
        {
            while(!q.empty())
            {
                sum=q.top();
                q.pop();
                if(q.empty())
                {
                    break;
                }
                sum1=q.top();
                q.pop();
                q.push(sum+sum1);
                count=count+sum+sum1;
            }
            printf("%d
",count);
        }

    }
    return 0;
}
#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdlib>
#include <cstdio>

#include <queue>//队列的头文件

using namespace std;

int a[10000];

int main()

{
    int n,a1,a2,i;

    int sum=0;
    cin>>n;
    for(i=0;i<n;i++)
    {
        cin>>a[i];
    }
    priority_queue<int , vector<int> , greater<int> >q;//从小到大排列
    for(i=0;i<n;i++)
    {
        q.push(a[i]);//进入队列
    }
    while(q.size()>1)//因为最后只剩下一组,所以控制长度大于1
    {
        a1=q.top();//将a1定义为首元素
        q.pop();//出队列
        a2=q.top();//将a2定义为首元素
        q.pop();//出队列
        sum+=a1+a2;
        q.push(a1+a2);//这里注意将a1+a2进入队列,而不是sum
    }
    cout<<sum<<endl;//最后输出sum
    return 0;
}
原文地址:https://www.cnblogs.com/zhangmingcheng/p/3893928.html