Cod sursa(job #1162595)

Utilizator tudgal1001Profir Tudor tudgal1001 Data 31 martie 2014 21:27:52
Problema Coduri Huffman Scor 75
Compilator cpp Status done
Runda Arhiva educationala Marime 1.28 kb
#include<fstream>
#include<queue>
#define inf 1LL*1000000000*1000000000
#define NMax 2000100
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 ()
{
    ifstream f("huffman.in");
    ofstream g("huffman.out");
    int N,Nr=0,i,coada,which,elem;
    long long LgT=0,Min;
    f>>N;
    for (i=1; i<=N; i++)
    {
        f>>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);
    g<<LgT<<"\n";
    for (i=1; i<=N; i++)
        g<<Lg[i]<<" "<<C[i]<<"\n";
    return 0;
}