一、補充知識點
- C++優先隊列
與列隊區別:可以自定義其中數據的優先級, 讓優先級高的排在隊列前面, 優先出隊。
priority_queue<Type, Container, Functional>
//Type 數據類型 Container容器類型(默認vector)
//Functional 比較方式
#include <queue>
using namespace std;
priority_queue <int> q; //默認大頂堆
//小頂堆
priority_queue <int,vector<int>,greater<int> > q;
//大頂堆
priority_queue <int,vector<int>,less<int> > q;
操作 | 語義 |
---|---|
top | 訪問隊頭元素 |
empty | 隊列是否為空 |
size | 返回隊列內元素個數 |
push | 插入元素到隊尾 (并排序) |
emplace | 原地構造一個元素并插入隊列 |
pop | 彈出隊頭元素 |
swap | 交換內容 |
二、例題
7.1 計算哈夫曼樹
- 題目描述
哈夫曼樹,第一行輸入一個數n,表示葉結點的個數。需要用這些葉結點生成哈夫曼樹,根據哈夫曼樹的概念,這些結點有權值,即weight,題目需要輸出所有結點的值與權值的乘積之和。
- 輸入描述
輸入有多組數據。
每組第一行輸入一個數n,接著輸入n個葉節點(葉節點權值不超過100,2<=n<=1000)。
- 輸出描述
輸出權值。
- 示例輸入
5
1 2 2 5 9
- 示例輸出
37
7.1代碼
#include <iostream>
#include <queue>
using namespace std;
int main()
{
int n;
priority_queue <int, vector<int>, greater<int> > q; //小頂堆
while(!q.empty())
{
q.pop(); //清空小頂堆
}
while(cin >> n){
int ans = 0;
for(int i = 1; i <= n; i++)
{
int x;
cin >> x;
q.push(x);
}
while(q.size()>1) //堆中元素大于1個
{
//取出堆中最小的兩個元素
int a = q.top();
q.pop();
int b = q.top();
q.pop();
ans += a + b;//求和作為父結點
q.push(a + b); //父結點放回堆中
//這里注意ans是累加和,push的是每次a+b的值才對
}
cout << ans << endl;
}
return 0;
}