哈夫曼树
题目要求输出所有结点的值与权值的乘积之和,因此也就是每两个最小结点的和结点的和。
优先级低的先输出(由小到大):
priority_queue<int,vector,greater > myPriorityQueue
优先级高的先输出(由大到小):
priority_queue<int,vector,less > myPriorityQueue
使用优先队列,可以高效的求出集合K中权值最小的两个元素,不过此时需要的不是优先值最大的元素,而是优先级最小的元素。
//给出序列,输出权值。优先级低的先输出
#include <cstdio>
#include <iostream>
#include <queue>
using namespace std;
int main(){
int n;
while(cin>>n){
priority_queue<int,vector<int>,greater<int> > myPriorityQueue;//定义由小到大的优先级
while(n--){
int x;
cin>>x;
myPriorityQueue.push(x);//先将全部元素入队。
}
int answer = 0;
while(myPriorityQueue.size() > 1){
int a = myPriorityQueue.top();
myPriorityQueue.pop();
int b = myPriorityQueue.top();
myPriorityQueue.pop();
answer += a+b; //要输出的。
myPriorityQueue.push(a+b);
}
cout<<answer<<endl;
}
return 0;
}