每个元素都被赋予了优先级,访问元素时,只能访问队列中优先级最高的元素。
头文件
#include<queue>
定义
priority_queue<typename> name;
和栈一样,只能通过top()访问最高级元素
#include<cstdio>
#include<iostream>
#include<cstring>
#include<vector>
#include<algorithm>
#include<queue>
using namespace std;
priority_queue<int> myPriorityQueue;
int main(){
myPriorityQueue.push(20);
myPriorityQueue.push(100);
myPriorityQueue.push(30);
myPriorityQueue.push(50);
cout<<myPriorityQueue.top()<<endl;//输出100
int sum=0;
while(!myPriorityQueue.empty()){
sum+=myPriorityQueue.top();
myPriorityQueue.pop();
}
cout<<sum;
}
复数集合 struct自定义类型的优先队列(重载+构造函数)
类定义
struct Complex{
int real;
int img;
Complex(int a,int b):real(a),img(b){}//构造函数
bool operator <(Complex c)const{ //重载
return real*real+img*img<c.real*c.real+c.img*c.img;
}
};
输入方法
else{
int a,b;
scanf("%d+i%d",&a,&b);//格式读入
mq.push(Complex(a,b));
cout<<"SIZE = "<<mq.size()<<endl;
}
哈夫曼树 给叶子结点权重求带权路径长度之和
带权路径之和即为所有非叶子节点的权值之和。
优先队列小顶堆的定义方法
priority_queue<typename,vector<typename>,greater<typename>> name;
样例和题解
#include<cstdio>
#include<iostream>
#include<cstring>
#include<vector>
#include<algorithm>
#include<queue>
using namespace std;
int main(){
int n;
while(cin>>n){
priority_queue<int,vector<int>,greater<int>> pq;
while(n--){
int x;
cin>>x;
pq.push(x);
}
int answer=0;
while(pq.size()!=1){
int a=pq.top();
pq.pop();
int b=pq.top();
pq.pop();
answer+=a+b;
pq.push(a+b);
}
cout<<answer;
}
}