1.基本用法
优先队列是取优先权最高的队列,默认是大顶堆
priority_queue<int>q1,可实现自动排序
若想实现小顶堆,需补全其余参数:
priority_queue<
int
, vector<
int
>, greater<
int
> >
q(注意最后两个<之间有空格)
如;POJ 3253,hdu 2547
#include<queue>
#include<cstdio>
using namespace std;
int main()
{
int N,n,i;
__int64 sum,n1,n2;
while(scanf("%d",&N)!=EOF)//4 1 1 1 1=8,4+3+2=9(X)
{
priority_queue<__int64,vector<__int64>,greater<__int64> > q1;
for(i=0;i<N;i++)
{
scanf("%d",&n);
q1.push(n);
}
sum=0;
for(i=1;i<N;i++)//哈夫曼树思想
{
n1=q1.top(),q1.pop();
n2=q1.top();q1.pop();
q1.push(n1+n2);
sum+=n1+n2;
}
printf("%I64d\n",sum);
}
return 0;
}
2.对自定义类型,需重载操作符‘<’
注意:先后(即先进入队列)顺序的排序
如:hdu 1873 看病要排队:http://acm.hdu.edu.cn/showproblem.php?pid=1873
priority_queue<int>q1
bool operator <(const struct partent &A,const struct partent &B)//注意此时默认是大顶堆,与sort()函数的comp函数不同
{
if(A.pri==B.pri) return A.ID>B.ID;
return A.pri<B.pri;
}
可实现在优先级(pri)相同时,先入先出;优先级不同时,优先级较大的先出
hdu 1509 Windows Message Queue:http://acm.hdu.edu.cn/showproblem.php?pid=1509
bool operator < (const struct message &A,const struct message &B)
{
if(A.pri==B.pri)
return A.num>B.num;
else
return A.pri>B.pri;
}
可实现在优先级(pri)相同时,先入先出;优先级不同时,优先级较小的先出