运用优先队列,可以将哈夫曼树序列的数字从小到大排列(借助负数取反技巧)
当队列中至少有两个元素的时候,取出队列头的两个元素相加,权重和加上这个数之后,把这个数重新压入优先队列,重复操作。
#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; }