运用优先队列,可以将哈夫曼树序列的数字从小到大排列(借助负数取反技巧)
当队列中至少有两个元素的时候,取出队列头的两个元素相加,权重和加上这个数之后,把这个数重新压入优先队列,重复操作。
#include <bits/stdc++.h>
using namespace std;
int main() {
int n;
scanf("%d", &n);
priority_queue<int> Myqueue;
for (int i = 0; i < n; i++) {
int m;
scanf("%d", &m);
Myqueue.push(-1 * m);
}//此时队列的头元素是队列最小的元素
int wpl = 0;//记录带权路径值
while (Myqueue.size() >= 2) {
int s1, s2;
s1 = Myqueue.top();
Myqueue.pop();
s2 = Myqueue.top();
Myqueue.pop();
wpl += (s1 + s2);
Myqueue.push(s1+s2);
}
printf("%d", -1 * wpl);
return 0;
}



京公网安备 11010502036488号