关于优先队列的重载:
当优先队列/堆中是结构体时,一定要先重新定义运算符或者自己定义一个比较函数。
PS:当只有两个关键字的时候,最好用pair,可以自动先比较第一个在比较第二个
法一:自己定义一个专门的结构体,用来比较
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<queue>
#define ll long long
using namespace std;
struct c
{
int x,y;
}k;
struct cmp{
bool operator() (c a,c b)
{
return a.x>b.x;
}
};
priority_queue<c,vector<c>,cmp >q;//一个大根堆
int main(){
k.x=10,k.y=100;q.push(k);
k.x=12,k.y=60;q.push(k);
k.x=12,k.y=40;q.push(k);
k.x=6,k.y=80;q.push(k);
while(!q.empty())
{
c m=q.top();
q.pop();
printf("(%d,%d)",m.x,m.y);
}
}
法二:重载符号
大根堆重载小于号,小根堆重载大于号
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<queue>
#define ll long long
using namespace std;
struct node
{
int x,y;
bool operator<(const node & a)const
{
if(x==a.x)return y<a.y;
return x<a.x;
}
}k;
priority_queue <node>q;//大根堆
int main(){
k.x=10,k.y=100;q.push(k);
k.x=12,k.y=60;q.push(k);
k.x=12,k.y=40;q.push(k);
k.x=6,k.y=80;q.push(k);
while(!q.empty())
{
node m=q.top();q.pop();
printf("(%d,%d)",m.x,m.y);
}
}