在最小生成树的算法中,用Kruskal算法和Prime算法来解决,其中Kruskal算法会用到并查集这个数据结构,而并查集在任何一种语言中都没有现成的以实现好的结构,在Prime中会用到最小堆也就是优先队列,恰好STL中有实现这个这个数据结构。
头文件:#include
优先队列的三种声明方式
1.一般声明方式
priority_queue<int> a; //通过操作,按照元素从大到小的顺序出队
priority_queue<int,vector<int>,greater<int>> b;
//通过操作,按照元素从小到大的顺序出队
2.自定义优先级
struct cmp{
operator bool()(int x , int y) {
return x > y; //x小的优先级高,也可以写成其他方式出队,例如:return a[i] > a[j],这样表示a[i]小的优先
}
};
priority_queue<int,vector<int>,cmp> s;
//其中,我们传入的第二个参数是容器的类型可以是vector,第三个参数为重载的比较函数
//重载时,只能重载 < ,重载 > 会出错。
struct cmp{
bool operator ()(int a,int b){
return a<b; //最大值优先
}
};
3.自定义数据结构
struct node {
int priority;
int value;
friend bool operator < (const node &a, const node &b) {
return a.priority < b.priority; //按照priority的优先级
}
/* 这样写也可以
bool operator < (const node &a) const {
return priority < a.priority;
}
*/
};
priority_queue<node> q;
在Dijkstras算法中也用到了最小堆,类型为pair
priority_queue<pair,vector<pair>,greaeter<pair> >q
就定义了一个由二元组构成的优先队列。pair定义了它自己的排序规则——先比较第一维,相等时才比较第二维。
为pair添加头文件#include<utility>(#include<map>)
和using namespace std;
map的内部设计到pair的使用,所以map头文件会自动添加#include头文件。