堆的性質
1.堆是一顆完全二叉樹
2.堆的頂端一定是“最大”,最小”的,但是要注意一個點,這裡的大和小並不是傳統意義下的大和小,它是相對於優先順序而言的,當然你也可以把優先順序定為傳統意義下的大小,但一定要牢記這一點,初學者容易把堆的“大小”直接定義為傳統意義下的大小,某些題就不是按數字的大小為優先順序來進行堆的操作的
3.堆一般有兩種樣子,小根堆和大根堆,分別對應第二個性質中的“堆頂最大”“堆頂最小”,對於大根堆而言,任何一個非根節點,它的優先順序都小於堆頂,對於小根堆而言,任何一個非根節點,它的優先順序都大於堆頂
如圖(小根堆) 對於堆的每個子樹,它同樣也是一個堆
堆的STL實現
首先你需要一個標頭檔案:#include< queue >
priority_queue<int> q;//這是一個大根堆q
priority_queue<int,vector<int>,greater<int> >q;//這是一個小根堆q
//注意某些編譯器在定義一個小根堆的時候greater<int>和後面的>要隔一個空格,不然會被編譯器識別成位運算子號>>
操作
q.top()//取得堆頂元素,並不會彈出
q.pop()//彈出堆頂元素
q.push()//往堆裡面插入一個元素
q.empty()//查詢堆是否為空,為空則返回1否則返回0
q.size()//查詢堆內元素數量
例題堆
程式碼展示
#include<bits/stdc++.h>
using namespace std;
int tot = 0,n;
priority_queue<int, vector<int>, greater<int> > q;
int main()
{
cin >> n;
for(int i = 1;i <= n; i++)
{
int x;
cin >> x;
q.push(x);
}
for(int i = 1;i < n; i++)
{
int x = q.top();q.pop();
int y = q.top();q.pop();
tot += x + y;
q.push(x + y);
}
cout << tot << endl;
}
. . . . . .