优先队列相关
写这个是因为补题要用到优先队列。
概念:
优先队列(priority queue)
普通的队列是一种先进先出的数据结构,元素在队列尾追加,而从队列头删除。在优先队列中,元素被赋予优先级。当访问元素时,具有最高优先级的元素最先删除。优先队列具有最高级先出 (first in, largest out)的行为特征。通常采用堆数据结构来实现。
这个东西呢STL里面是有的,可以拿来直接用,很方便,至于手写的话,先等我学了堆的操作再说吧。。
定义一个优先队列:
priority_queue <int> Q; //默认从大到小排序
priority_queue <int,vector<int>,less<int> > Q; //STL自带的可以方便的从大到小排序
priority_queue <int,vector<int>,greater<int> > Q; //STL自带的可以方便的从小到大排序
//int 换成 node 等结构体也可以,总之就是类型
队首元素使用top()函数取出,push()入队一个元素,会根据优先级自动排列,所有操作均为logn时间完成
当需要根据题目要求,对与结构体,优先级定义更为复杂时,有两种处理方法。
1.重载运算符。
一般重载运算符时,都是 < 重载。
struct E
{
int v,w;
bool operator< (const E& b) const
{
return w > b.w;
}
};
struct E
{
int v,w;
friend bool operator< (E x,E y)
{
return x.w>y.w;
}
};
2.类比于sort函数,手写一个cmp函数。
struct cmp
{
bool operator () (const node &x,const node &y) const
{
return x.w>y.w;
}
}
然后priority_queue <E,vector<E>,cmp > Q;
c++还没学,就先这样吧,错了再改...
优先队列的应用:
可以保证每次取的优先级最高的元素,速度快。