带权路径长度(c++优先队列)

带权路径长度(c++优先队列)_第1张图片

思路:本题是求带权路径长度,可以用常规的构造哈夫曼树求带权路径长度;此外带权路径长度还是哈夫曼树所有非叶子节点的和;本题我采用的是通过求所有非叶子节点的和来就带权路径长度;

第一次的代码如下:

#include//包含了所有c++头文件
using namespace std;
int main()
{
    int n,i,sum=0;
    while(scanf("%d",&n)!=EOF)
    {
        int a[n];
        sum=0;
        for(i=0;i

     这种方法时间复杂度比较高,每次循环都要重新排序,如果数组很大的话,将会消耗很大的时间,所以提交也就时间超限了;

心想如果不用排序的话就不用消耗那么多的时间了,怎么办呢?想了想还是不会;然后再百度找到了优先队列的解法,优先队列的特点就是自动排序,第一次接触这个东西,感觉还是很神奇的。

优先队列的解法代码如下:

#include
using namespace std;
int main()
{
    int  n,t;
    long long num[100000];
    while(scanf("%d",&n)!=EOF)
    {
        priority_queue ,greater >q;
        for(t=1; t<=n; t++)
        {
            scanf("%ld",&num[t]);
            q.push(num[t]);
        }
        long long sum=0;
        long long a=0;
        long long b=0;
        long long x=0;
        for(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;
        printf("%ld\n",sum);
    }
    return 0;
}

 

你可能感兴趣的:(优先队列)