九度1112:哈夫曼树 STL中堆的使用

Problem Description

哈夫曼树,第一行输入一个数n,表示叶结点的个数。需要用这些叶结点生成哈夫曼树,根据哈夫曼树的概念,这些结点有权值,即weight,题目需要输出所有结点的值与权值的乘积之和。

int main()
{
    int n,temp,ans;
    Node a,b;
    while (cin>>n)
    {
        ans=0;
        vector<Node> heap;
        for (int i=0;i<n;i++) {
            cin>>temp;
            Node node;
            node.deep=0;
            node.weight=temp;
            heap.push_back(node);
        }
        make_heap(heap.begin(),heap.end(),greater<int>());//默认Less,最大堆
        while (heap.size()>1)
        {
//            for (vector<Node>::iterator i=heap.begin();i!=heap.end();i++)
//            {
//                cout<<*i<<" ";
//            }
            cout<<"\n";
            pop_heap(heap.begin(),heap.end(),greater<int>());//这些都需要加参数
            a=heap.back();
            heap.pop_back();
            pop_heap(heap.begin(),heap.end(),greater<int>());
            b=heap.back();
            heap.pop_back();
            Node c;
            c.deep
            c.weight=a.weight+b.weight;
            heap.push_back(a+b);
            ans+=a+b;
            push_heap(heap.begin(),heap.end(),greater<int>());
        }

        cout<<ans<<"\n";
    }
    return 0;
}
   

注意事项

1.WPL有一个简便运算,就是所有非叶子节点的权重和,知道这一点就容易多了
2.priority_queue内部也是使用vector容器,使用make_heap\push_heap两个函数的最大堆,这两个函数默认都是less,故要用的话每次都要改参数

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 定义指针变量,如果不赋给它地址,系统会随机给它分配一个地址。 C++标准库 C++ Standard Librar...
    纵我不往矣阅读 304评论 0 1
  • 第一章 绪论 什么是数据结构? 数据结构的定义:数据结构是相互之间存在一种或多种特定关系的数据元素的集合。 第二章...
    SeanCheney阅读 5,821评论 0 19
  • 什么是哈夫曼树(Huffman Tree)eg:将百分制的考试成绩转换为五分制的成绩if ( score < 60...
    Spicy_Crayfish阅读 2,127评论 1 1
  • 判定树 每个结点需要查找的次数刚好为该结点所在的层数,查找成功时查找次数不会超过判定树的深度,n个结点的判定树的深...
    sunxiaohang阅读 1,521评论 0 3
  • 每天上班都是这样,头一天晚上计划好的事情,到第二天早上就全盘打乱。 原本想着今天早上开始做成本的事儿,结果报公司报...
    优雅的成长阅读 224评论 0 0