Cod sursa(job #1465202)

Utilizator CollermanAndrei Amariei Collerman Data 26 iulie 2015 18:48:35
Problema Coduri Huffman Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.78 kb
#include <fstream>
#include <vector>
using namespace std;
ofstream fout("huffman.out");
ifstream fin("huffman.in");
const int NMAX = 1000100;
const long long INF = (1LL << 62);

struct Nod
{
    long long val;
    int fii[2];                         // fii[0] = fiul stang , fii[1] = fiul drept;

} Arbore[NMAX * 2 + 1];

int n, nr_coada, nod_nou;
int Coada[2][NMAX], s[2], d[2];
int Nivel[NMAX];
long long sol, Min;
long long Val[NMAX];

void citire()
{
    fin >> n;
    for(int i=1; i<=n; i++) {
        fin >> Arbore[i].val;
        Coada[0][i] = i;
    }
}

void dfs(int nod, long long cod, int nivel)
{
    if(Arbore[nod].fii[0]) {
        dfs(Arbore[nod].fii[0], cod * 2, nivel + 1);
        dfs(Arbore[nod].fii[1], cod * 2 + 1, nivel + 1);
        return;
    }

    Nivel[nod] = nivel;
    Val[nod] = cod;
}

void rezolva()
{
    s[0] = s[1] = 1;
    d[0] = nod_nou = n;

    while(s[0] + s[1] <= d[0] + d[1])
    {
        nod_nou++;
        for(int i=0; i<2; i++) {
            Min = INF;
            nr_coada = 0;

            for(int j=0; j<2; j++)
            {
                if(Arbore[Coada[j][s[j]]].val < Min && s[j] <= d[j] ) {
                    Min = Arbore[Coada[j][s[j]]].val;
                    nr_coada = j;
                }
            }

            Arbore[nod_nou].val += Arbore[Coada[nr_coada][s[nr_coada]]].val;
            Arbore[nod_nou].fii[i] = Coada[nr_coada][s[nr_coada]];
            s[nr_coada]++;
        }

        sol += Arbore[nod_nou].val;
        Coada[1][++d[1]] = nod_nou;
    }

    dfs(nod_nou, 0, 0);
}

void afis()
{
    fout << sol << '\n';
    for(int i=1; i<=n; i++) fout << Nivel[i] << ' ' << Val[i] << '\n';
}

int main()
{
    citire();
    rezolva();
    afis();
    return 0;
}