POJ 3253 采用优先队列 构造赫夫曼树

来源:互联网 发布:电子称软件下载 编辑:程序博客网 时间:2024/06/06 00:06
                    优先队列基本操作:empty() 如果队列为空返回真pop() 删除对顶元素push() 加入一个元素size() 返回优先队列中拥有的元素个数top() 返回优先队列对顶元素在默认的优先队列中,优先级高的先出队。在默认的int型中先出队的为较大的数。使用方法:头文件:#include <queue>声明方式:1、普通方法:priority_queue<int>q;//通过操作,按照元素从大到小的顺序出队 2、自定义优先级:struct cmp{operator bool ()(int x, int y){return x > y; // x小的优先级高//也可以写成其他方式,如: return p[x] > p[y];表示p[i]小的优先级高}};priority_queue<int,vector<int>,cmp>q;//定义方法//其中,第二个参数为容器类型。第三个参数为比较函数。3、结构体声明方式:struct node{int x, y;friend bool operator < (node a, node b){return a.x > b.x; //结构体中,x小的优先级高}};priority_queue<node>q;//定义方法//在该结构中,y为值, x为优先级。//通过自定义operator<操作符来比较元素中的优先级。//在重载”<”时,最好不要重载”>”,可能会发生编译错误 STL 中队列的使用(queue)基本操作:push(x) 将x压入队列的末端pop() 弹出队列的第一个元素(队顶元素),注意此函数并不返回任何值front() 返回第一个元素(队顶元素)back() 返回最后被压入的元素(队尾元素)empty() 当队列为空时,返回truesize() 返回队列的长度使用方法:头文件:#include <queue>声明方法:1、普通声明queue<int>q;2、结构体struct node{int x, y;};queue<node>q; STL 中栈的使用方法(stack)基本操作:push(x) 将x加入栈中,即入栈操作pop() 出栈操作(删除栈顶),只是出栈,没有返回值top() 返回第一个元素(栈顶元素)size() 返回栈中的元素个数empty() 当栈为空时,返回 true使用方法:和队列差不多,其中头文件为:#include <stack>定义方法为:stack<int>s1;//入栈元素为 int 型stack<string>s2;// 入队元素为string型stack<node>s3;//入队元素为自定义型
/*题意:构造赫夫曼树  采用优先队列 **/#include <stdio.h>#include <iostream>#include <vector>#include <queue> using namespace std;struct cmp{  bool operator()(const int &i,const int &j){         return i>j;//小的优先级高        }       };int main(){    int n,i,a,b,temp;    priority_queue <int, vector<int>,cmp>q;     __int64 sum;    while(cin>>n){    sum=0;    for(i=0;i<n;i++){          cin>>temp;          q.push(temp);               }                  while(q.size()!=1){         a=q.top();         q.pop();         b=q.top();         q.pop();         sum+=(a+b);         q.push(a+b);                       }       cout<<sum<<endl;               }    return 0;}

原创粉丝点击