二叉树 | 哈夫曼树

2019-08-22  本文已影响0人  zilla

参考:胡凡,曾磊「算法笔记」,emmmmm算是梳理吧。图片和部分描述均来自此书~

引:合并果子问题

n堆已知质量的果子,需要把他们合并为一堆,但每次只能合二为一,并消耗与这两堆果子总质量相同的体力。怎样使体力消耗最少?

哈夫曼树(最优二叉树)

已知n个数,寻找一棵树,使得所有叶子结点恰为这n个数,并且树的带权路径长度最小。
对于同一组叶子结点,哈夫曼树可能不唯一,但最小WPL唯一。
#include <cstdio>
#include <queue>
#include <vector>
#include <functional>
typedef long long LL;
using namespace std;
priority_queue<LL, vector<LL>, greater<>> mq;
// 有些版本编译器需要greater<int>
int main() {
    int nn;
    LL temp, wpl = 0;
    scanf("%d", &nn);
    for (int i = 0; i < nn; ++i) {
        scanf("%lld", &temp);
        mq.push(temp);
    }
    while (mq.size() > 1) {
        LL a = mq.top();
        mq.pop();
        LL b = mq.top();
        wpl += (a + b);
        mq.pop();
        mq.push(a + b);
    }
    printf("%lld\n", wpl);
    return 0;
}

哈夫曼编码

上一篇 下一篇

猜你喜欢

热点阅读