Cod sursa(job #928780)

Utilizator andrettiAndretti Naiden andretti Data 26 martie 2013 18:08:22
Problema Coduri Huffman Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.47 kb
#include<stdio.h>
#include<queue>
#define maxn 1000005
using namespace std;

struct nod{long long int f;int st,dr;} v[maxn*2];
int n,m;
long long int l[maxn],cod[maxn],s;
queue <int> q1,q2;

void cit()
{
    int i;

    scanf("%d",&n);
    for(i=1;i<=n;i++)
    {
        scanf("%lld",&v[i].f);
        q1.push(i);
    }
    m=n;
}

int extract_min()
{
    int minn;
    if(q2.empty()) { minn=q1.front(); q1.pop(); return minn;}
    if(q1.empty()) { minn=q2.front(); q2.pop(); return minn;}
    if(v[q1.front()].f<=v[q2.front()].f) { minn=q1.front(); q1.pop(); return minn;}

    minn=q2.front(); q2.pop(); return minn;
}

void create_tree()
{
    int min1,min2;

    while(q1.size()+q2.size()>1)
    {
        min1=extract_min();
        min2=extract_min();

        m++;
        v[m].f=v[min1].f+v[min2].f;
        v[m].st=min1; v[m].dr=min2;
        q2.push(m);
   }
}

void df(int k,long long int cd,long long int niv)
{
    if(v[k].st)
    {
        df(v[k].st,cd*2,niv+1);
        df(v[k].dr,cd*2+1,niv+1);
    }
    else
    {
        l[k]=niv;
        cod[k]=cd;
        s+=(niv*v[k].f);
    }
}

void afis()
{
    int i;

    printf("%lld\n",s);
    for(i=1;i<=n;i++) printf("%lld %lld\n",l[i],cod[i]);
}

int main()
{
    freopen("huffman.in","r",stdin);
    freopen("huffman.out","w",stdout);

    cit();
    create_tree();
    df(m,0,0);
    afis();

    fclose(stdin);
    fclose(stdout);
    return 0;
}