带权路径长度 hnust数据结构

来源:互联网 发布:软件著作权登记申请表 编辑:程序博客网 时间:2024/06/05 08:58

问题 U: 带权路径长度

时间限制: 2 Sec  内存限制: 128 MB
提交: 268  解决: 48
[提交][状态][讨论版]

题目描述

给定n个权值作为n个叶子结点,构造哈夫曼树, 求其带权路径长度。

输入

输入由多组数据组成。

每组数据分成两行。第一行仅一个整数n(2<=n<=100000)。第二行有n个空格分开的权值,值范围在[1,1000000000]之间。

输出

对于每组测试数据,输出一行,即其对应哈夫曼树的带权路径长度对1000000007取模。

样例输入

47 5 2 485 29 7 8 14 23 3 11

样例输出

35271


首先哈夫曼数的带权路径长度不仅仅可以按照常规方法求,它也是所有非叶子节点之和,所以我们可以维护一个队列,每次取最小的两个数进行相加,再PUSH进队列中。一直到队列为空,最后一个出队列的数便是答案。我们用STL中的优先队列可以很快AC掉这道题。不过老师的初衷是让我们自己编写平衡二叉树去实现,这里因为接触过STL所以偷懒了。

#include <iostream>#include <stdio.h>#include <math.h>#include <stdlib.h>#include <algorithm>#include <queue>using namespace std;struct cmp{       bool operator()(long long x,long long y)    {        return x>y;    }};int main(){    int  n;    long long num[100000];    while(scanf("%d",&n)!=EOF)    {        priority_queue <long long,vector<long long>,cmp>q;        for(int t=1; t<=n; t++)        {            cin >> num[t];            q.push(num[t]);        }        long long sum=0;        long long a=0;        long long b=0;        long long x=0;        for(int t=2; t<=n; t++)        {            a=q.top();            q.pop();            b=q.top();            q.pop();            sum+=a+b;            x=a+b;            q.push(x);        }        sum=sum%1000000007;        cout << sum <<endl;    }    return 0;}


原创粉丝点击