1、问题描述
通常在刷题的时候,会遇到最大堆、最小堆的问题,这个时候如果自己去实现一个也是OK的,但是通常时间不太够,那么如何处理?这时,就可以借助C++ STL的priority_queue。
2、具体分析
- 需要注意的是,C++ STL默认的priority_queue是将优先级最大的放在队列最前面,也即是最大堆。那么如何实现最小堆呢?
假设有如下一个struct:
struct Node {
int value;
int idx;
Node (int v, int i): value(v), idx(i) {}
friend bool operator < (const struct Node &n1, const struct Node &n2) ;
};
inline bool operator < (const struct Node &n1, const struct Node &n2) {
return n1.value < n2.value;
}
priority_queue<Node> pq; // 此时pq为最大堆
如果需要最小堆,则需要如下实现:
struct Node {
int value;
int idx;
Node (int v, int i): value(v), idx(i) {}
// friend bool operator < (const struct Node &n1, const struct Node &n2) ;
friend bool operator > (const struct Node &n1, const struct Node &n2) ;
};
inline bool operator > (const struct Node &n1, const struct Node &n2) {
return n1.value > n2.value;
}
priority_queue<Node, vector<Node>, greater<Node> > pq; // 此时greater会调用 > 方法来确认Node的顺序,此时pq是最小堆
3、其他方式
当然,还有些比较小的较为hack的手段进行。比如要构造一个int类型的最小堆:
priority_queue<int> pq; //
pq.push( -1 * v1) ; //
pq.push( -1 * v2) ; //
pq.push( -1 * v3) ; // 分别是插入v1, v2, v3变量的相反数,那么pq其实也就变相成为了最小堆,只是每次从pq取值后,要再次乘以-1即可
4、用最小堆解决问题
Codeforces Round #536 (Div. 2), problem: (D) Lunar New Year and a Wander
推荐阅读这篇博客——Codeforces Round #536 (Div. 2), problem: (D) Lunar New Year and a Wander 【最小堆+bfs】
学如逆水行舟,不进则退