priority_queue:优先队列
顾名思义,这个东西可以用于存放单调的数据,后面将会看到用于优化Dijkstra
有3个类函数:
void push(元素类型 变量)
void pop()
int top()
int size()
bool empty()
分别是:
定义:
数据类型:int,double.....
容器类型:vector(默认),deque,但不能是list
元素比较方式:less(默认,不上升序),greater(不下降序)
比如要定义一个元素值为整数,容器为vector<int>的不下降序的优先队列PQ:
priority_queue <int,vector<int> ,greater<int> >PQ
如果是第3种定义方式,容器默认为vector,比较方式默认是less(第二种的默认比较方式也是less)
实用的例子:
堆优化的Dijkstra算法,写出堆不难,但麻烦,如果想更快的写出高效的Dijkstra,用priority_queue就很不错:
#include <queue> priority_queue <pair<int ,int>,vector<pair<int ,int> >,greater<pair<int,int> > > PQ; void Dijkstra() { while(!PQ.empty()) PQ.pop(); MC[1]=0; PQ.push(pair<int,int>(MC[1],1)); while(!PQ.empty()) { int Index=PQ.top().second; PQ.pop(); if(!flag[Index]) { flag[Index]=true; for(Node *p=last[Index];p;p=p->Prev) if(!flag[p->Name] && MC[p->Name]>MC[Index]+p->Dis) { MC[p->Name]=MC[Index]+p->Dis; PQ.push(pair<int,int>(MC[p->Name],p->Name)); } } } }
MC是最小花费
flag标志数组
last 邻接表
更详细的信息请参阅:
http://www.cplusplus.com/reference/queue/priority_queue/priority_queue/
参考
http://blog.chinaunix.net/space.php?uid=533684&do=blog&cuid=2615612