置頂!!!node
有時候在定義的時候,不要把兩個<<或者>>連在一塊兒寫,以避免被編譯器錯誤理解!!!!bash
#include <queue>
數據結構
queue的通常用法再也不敘述less
priority_queue
(設變量名爲q)函數
q.pop();
q.push(x);
q.size();
q.empty();
q.top(); //注意與通常的queue中的q.front()不一樣
複製代碼
priority_queue<int,vector<int>,greater<int>> q;
//固然大根堆就是less優化
struct rec{
int a,b
};
struct cmp {
bool operator ()(rec x, rec y)
{
return x.a > y.a; //結構體中,x小的優先級高 (意即大於號出來的是小根堆)
}
};
複製代碼
priority_queue<int, vector<int>, cmp> q; //定義方法
ui
struct node {
int x, y;
friend bool operator < (node a, node b)
{
return a.x > b.x; //結構體中,x小的優先級高 (意即大於號出來的是小根堆)
}
};
複製代碼
priority_queue<node>q; //定義方法
spa
//經過自定義operator<操做符來比較元素中的優先級。code
//在重載」<」時,最好不要重載」>」,可能會發生編譯錯誤隊列
#include <ext/pb_ds/tree_policy.hpp>
#include <ext/pb_ds/assoc_container.hpp>
//這個是pb_ds要求的頭文件,注意平板電視裏面涉及的頭文件都不在bits/std標準庫中
複製代碼
#include <ext/pb_ds/priority_queue.hpp>
using namespace __gnu_pbds;
(小心前面是兩個下劃線啊,小心啊!!!)
//固然pb_ds還有其餘很是好用的數據結構,只不過我如今還不會
//留個坑待填(雖然可能不會填)
與priority_queue基本相同
有一些拓展的函數
q.join(q1); //把q1所有合併到q中去,而且把q1清空
複製代碼
q.point_iterator; //對應某元素的迭代器
q.erase(point_iterator it); //刪除對應點
q.modify(point_iterator it,const_reference r_new_val); //修改對應點的值(這是優化dijkstra神方法,均攤複雜度O(1))
//迭代器這一部分我不會啊 又留了一個坑
//若是學會就行了,這個確實很實用
複製代碼
__gnu_pbds::priority_queue<int,greater<int>,TAG> Q;//小根堆,大根堆寫less<int>
//注意這個裏面的前面的__gnu_pbds::不要省略,由於雖然定義了命名空間,可是由於標準庫裏面也有priority_queue,這個就很ambigious
複製代碼
其中的TAG爲類型,有如下幾種:
pairing_heap_tag
thin_heap_tag
binomial_heap_tag
rc_binomial_heap_tag
binary_heap_tag
其中pairing_help_tag最快
複製代碼
對於上方的兩種方式,通過個人屢次實驗,發現只有第一個可用,第二種不管我怎麼調都是CE,這個與優先隊列的定義方法有關
就採用第一種罷!
對於第一種,結構體定義都是同樣的
定義方法改爲這樣 __gnu_pbds::priority_queue<rec,cmp,pairing_heap_tag> Q;
大概就是以上部分😋
留坑代填