DomiSun發表於2024-10-03

堆的性質

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;
}

. . . . . .

相關文章