3319 哈夫曼树 优先队列 最小堆
#include <bits/stdc++.h> using namespace std; typedef long long ll; const int N = 1e3 + 10, inf = 0x3f3f3f3f; // 优先队列(最小堆),用于存储叶结点的权值 priority_queue<int, vector<int>, greater<int>> q; int n, ans, x; int main() { // 读取叶结点的数量 cin >> n; // 读取每个叶结点的权值,并将其放入优先队列 for (int i = 1; i <= n; i++) { int x; cin >> x; q.push(x); } // 构建哈夫曼树 while (q.size() > 1) { // 取出两个最小的权值 int a = q.top(); q.pop(); int b = q.top(); q.pop(); // 累加这两个权值之和到带权路径长度 ans += a + b; // 将合并后的权值重新放入优先队列 q.push(a + b); } // 输出最终的带权路径长度 cout << ans; return 0; }