八叶一刀·无仞剑

万物流转,无中生有,有归于无

导航

poj3253

Posted on 2013-11-11 09:59  闪之剑圣  阅读(243)  评论(0编辑  收藏  举报

一道赫夫曼树的经典题目,一直以为这题的代码会很复杂,没想到书中竟描述地如此简单

#include <stdio.h>
int n;
long long  p[20010];
//一道经典的赫夫曼编码题
void swap(int &min1,int& min2)
{
    int d;
    d=min1;
    min1=min2;
    min2=d;
}
int main()
{
    scanf("%d",&n);
    int i;
    for(i=1;i<=n;i++)
        scanf("%lld",&p[i]);
    if(n==2||n==1)
    {
        long long  sum=0;
        for(i=1;i<=n;i++)
        sum+=p[i];
        printf("%lld\n",sum);
        return 0;
    }
    long long ans=0;
    while(n>1)
    {
    int min1=1,min2=2;
    if(p[min1]>p[min2])
        swap(min1,min2);
    for(i=3;i<=n;i++)
    {
        if(p[i]<p[min1])
        {
            min2=min1;
            min1=i;
        }
        else if(p[i]<p[min2])
            min2=i;
    }
    long long t=p[min1]+p[min2];
    ans+=t;
    if(min1==n)swap(min1,min2);
    p[min1]=t;
    p[min2]=p[n];
    //p[min1]=t;
    //if(min1!=n)swap(min2,n);
    n--;
    }
    printf("%lld\n",ans);
    return 0;
}