Cod sursa(job #1162045)

Utilizator tudgal1001Profir Tudor tudgal1001 Data 31 martie 2014 16:43:41
Problema Coduri Huffman Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.33 kb
#include<cstdio>
#include<queue>
#define inf 1LL*1000000000*1000000000
#define NMax 1000100
using namespace std;

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

void DF (int crt, long long 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);
        return;
    }
    C[crt]=cod;
    Lg[crt]=nivel;
}

int main ()
{
    int N,Nr=0,i,coada,which,elem;
    long long LgT=0,Min;
    freopen("huffman.in","r",stdin);
    freopen("huffman.out","w",stdout);
    scanf("%d",&N);
    for (i=1; i<=N; i++)
    {
        scanf("%lld",&nod[++Nr].val);
        Q[0].push(i);
    }
    while (Q[0].size() + Q[1].size() >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;
        Q[1].push(Nr);
    }
    DF(Nr,0,0);
    printf("%lld\n",LgT);
    for (i=1; i<=N; i++)
        printf("%d %lld\n",Lg[i],C[i]);
    return 0;
}