哈夫曼树
很多题目不需要真的构造一个哈夫曼树,只需要能得到最终的带权路径长度即可;
因此先掌握哈夫曼树的构建思想,即反复选择最小的两个元素进行合并,直到只剩下一个元素即可
- 实现:
可使用优先队列(堆结构)进行来执行这种策略
- 样例
//哈夫曼树 思想 - 优先队列实现 最佳合并
priority_queue<int, vector<int>, greater<int> > q;
int main() {
int n, temp, x, y, ans = 0;
scanf("%d", &n);
for(int i = 0; i < n; i++) { //数据输入优先级队列中
scanf("%d", &temp);
q.push(temp);
}
while(q.size() > 1) { //队列中元素多余1个
//取出堆顶的两个元素
x = q.top();
q.pop();
y = q.top();
q.pop();
q.push(x + y);
ans += x + y;
}
printf("%d\n", ans);
return 0;
}