Cod sursa(job #1162000)

Utilizator tudgal1001Profir Tudor tudgal1001 Data 31 martie 2014 16:16:42
Problema Coduri Huffman Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.31 kb
#include<cstdio>
#include<queue>
#define inf 0x3f3f3f3f
#define NMax 1000005
using namespace std;

struct tip { int val,fiu[5]; } nod[NMax];
int C[NMax],Lg[NMax];
queue<int> Q[5];

void DF (int crt, int cod, int nivel)
{
    if (nod[crt].fiu[0])
    {
        DF(nod[crt].fiu[0],2*cod,nivel+1);
        DF(nod[crt].fiu[1],2*cod+1,nivel+1);
    }
    else
    {
        C[crt]=cod;
        Lg[crt]=nivel;
    }
}

int main ()
{
    int N,Nr=0,i,LgT=0,coada,which,elem,Min;
    freopen("huffman.in","r",stdin);
    freopen("huffman.out","w",stdout);
    scanf("%d",&N);
    for (i=1; i<=N; i++)
    {
        scanf("%d",&nod[++Nr].val);
        Q[0].push(i);
    }
    while (1)
    {
        Nr++;
        for (elem=0; elem<2; elem++)
        {
            which=0, Min=inf;
            for (coada=0; coada<2; coada++)
                if (!Q[coada].empty())
                    if (nod[Q[coada].front()].val<Min)
                        Min=nod[Q[coada].front()].val, which=coada;
            nod[Nr].fiu[elem]=Q[which].front();
            nod[Nr].val+=Min;
            Q[which].pop();
        }
        LgT+=nod[Nr].val;
        if (!Q[0].empty() || !Q[1].empty())
            Q[1].push(Nr);
        else break;
    }
    DF(Nr,0,0);
    printf("%d\n",LgT);
    for (i=1; i<=N; i++)
        printf("%d %d\n",Lg[i],C[i]);
    return 0;
}