运用优先队列,可以将哈夫曼树序列的数字从小到大排列(借助负数取反技巧)

当队列中至少有两个元素的时候,取出队列头的两个元素相加,权重和加上这个数之后,把这个数重新压入优先队列,重复操作。

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