文章
20
粉丝
224
获赞
56
访问
136.8k
首先,结点的带权路径长度 = 从根结点到该结点之间的路径长度 X 该结点的权,但是,计算WPL其实可以不用刻意算出每个结点的到根节点的路径长度,我们只需在构造哈夫曼时除根节点以外的节点权值加和就好了,因为在加和过程中越靠下的节点被加了多次,这个次数其实也就是它离根节点的路径长度,具体的证明可以参考这篇文章:哈夫曼树带权路径长度简便算法
#include<iostream>
#include<queue>
using namespace std;
struct node {
int x;
// 定义优先队列的比较关系,这里我们定义的是小根堆
bool operator < (const node& a) const {
return x > a.x;
}
};
int main() {
int n, x;
while (scanf("%d", &n) != EOF) {
priority_queue<node> q;
while (n--) {
cin >> x;
q.push(node{x});
}
int ans = 0;
while (q.size() > 1) {
node num1 = q.top();
q.pop();
node num2 = q.top();
q.pop();
ans += num1.x + num2.x;
q.push(node{num1.x + num2.x});
}
cout << ans << endl;
}
}
登录后发布评论
暂无评论,来抢沙发