优先队列嘛,就是队列。结束......
哈哈,优先队列本质上不是一个队列,它其实是一个堆,但他的操作却像是队列。
关于堆的定义,可以好好看看oiwiki上的解释
优先队列的最大特点,就是数据插入时会自动排序(真的香),而且时间复杂度是logn,超快的好吧
堆,有大根堆,小根堆。那么优先队列如果按照堆来存储,那么是哪种堆呢?
当然是都可以。
首先,调用一个优先队列
#include <queue>
std::priority_queue<int>que;
这是最简单的,定义一个int型的优先队列,但是很多情况下都不会是一个普通的int来存储,所以又产生了以下操作
#include <bits/stdc++.h>
using namespace std;
#define P node
struct cmp{ //自定义优先级
bool operator()(P A,P B){
return B.x > A.x ;
}
}
struct node{
int x,y;
};
priority_queue< P , vector<P> , cmp >que;
我们先做好一个优先队列,再进行操作(还没定义好就先别急操作)
自定义优先级,可以记住模板(struct cmp那段),最重要的就是return那里,结构体B在优先队列的位置是在A之前的(原因我也不清楚,一直没去了解,如果有人知道,可以告诉我一下)
这个优先队列表示的就是将结构体存入que后,结构体是按node.x从大到小排列的(如果大小一样,按入队顺序)
这里给出两个可以直接替换的cmp
greater<int>
less<int>
第一个,greater就是越来越大
第二个就是越来越小
如果按照最上面代码示例调用的话,默认是less
说完了调用,自定义优先级。接下来看看优先队列的使用;
que.push() //压队
que.top() //返回队首元素
que.pop() //弹出队首元素
que.size() //返回队列长度
que.empty() //判断是否为空,空返回1,否则返回0
这些应该很好看懂
从que.top()就能看出,他不是一个单纯的队列,因为队列应该是用front
给一个完整的代码吧
#include<bits/stdc++.h>
using namespace std;
priority_queue<int>que;
int main()
{
que.push(5);
que.push(2);
que.push(9);
que.push(7);
que.push(1);
cout<<que.size()<<endl; //长度
while(!que.empty()){ //优先队列是不能从下标访问的
cout<<que.top()<<" ";
que.pop();
}
return 0;
}
//输出
// 5
// 9 7 5 2 1
#include<bits/stdc++.h>
using namespace std;
struct node{
int x,y;
node(int x,int y):x(x),y(y){}
};
struct cmp{
bool operator()(node a,node b){
return b.x>a.x;
}
};
priority_queue<node,vector<node>,cmp>que;
int main()
{
que.push(node(2,9));
que.push(node(5,4));
que.push(node(7,1));
que.push(node(1,0));
que.push(node(5,8));
while(!que.empty()){
cout<<que.top().x<<" "<<que.top().y<<endl;
que.pop();
}
return 0;
}
例题
https://ac.nowcoder.com/acm/contest/83317/Ihttps://ac.nowcoder.com/acm/contest/83317/Ihttps://www.lanqiao.cn/problems/4445/learning/?page=1&first_category_id=1&tags=%E4%BC%98%E5%85%88%E9%98%9F%E5%88%97
https://www.lanqiao.cn/problems/4445/learning/?page=1&first_category_id=1&tags=%E4%BC%98%E5%85%88%E9%98%9F%E5%88%97