• 哈夫曼树——贪心


    哈夫曼树——贪心

    哈夫曼树:给定n个权值作为n的叶子结点,构造一棵二叉树,若带权路径长度达到最小,称这样的二叉树为最优二叉树,也称为哈夫曼树(Huffman tree)。哈夫曼树是带权路径长度                 最短的树,权值较大的结点离根较近。

    此类题目一般求算哈夫曼树路径总值,利用贪心选择性质每次从队头取出两个边权和最小的树合并成新树入队(优先队列,保证队首元素最小),每次记录新树权值,当队内只剩一棵树时结束算法;

    priority_queue<long long,vector<long long>,greater<long long> > q; 
    
    //优先队列,使元素值小的优先权大,(默认元素值大的优先权大);
    
    long long huffman() //哈夫曼树,贪心算法
    {
        long long res=0;         //最小代价
        while(q.size()>=2){          //每次合并最小的两个元素,(在队头);
            long long a=q.top();q.pop();
            long long b=q.top();q.pop();
            q.push(a+b);
            res+=a+b;      //计算代价
        }
        return res;
    }
    
    int main()
    {
        while(cin>>N){
            while(!q.empty()) q.pop();
            while(N--){
                long long tmp;
                cin>>tmp;
                q.push(tmp);    //直接入队
            }
            cout<<huffman()<<endl;
        }
        return 0;
    }
    huffman贪心算法
    没有AC不了的题,只有不努力的ACMER!
  • 相关阅读:
    通过mixins方法处理调取服务器时间
    记录个人对vuex的简单理解
    利用弹性布局实现垂直居中
    vue.set的适用方法
    深拷贝和浅拷贝的实现方法
    Maven安装步骤
    build tools
    Git
    Url和Uri的区别
    函数式编程语言
  • 原文地址:https://www.cnblogs.com/--560/p/4330184.html
Copyright © 2020-2023  润新知