Cod sursa(job #2077570)

Utilizator AlexGAlexandru Gheorghe AlexG Data 28 noiembrie 2017 11:34:26
Problema Coduri Huffman Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.72 kb
#include <iostream>
#include <fstream>
#include <climits>

using namespace std;

const int nMax = 1000000;
struct Nod
{
    long long v;
    int f[2];
} nod[2*nMax - 1];

struct Coada
{
    int i[nMax];
    int s;
    int d;
} c[2];

int n;
int lCod[nMax];
long long cod[nMax], lg;

void parcurgereInAdancime(int i, long long codZ, long n)
{
    if(nod[i].f[0] != -1)
    {
        parcurgereInAdancime(nod[i].f[0], codZ*2, n+1);
        parcurgereInAdancime(nod[i].f[1], codZ*2+1, n+1);
        return;
    }
    lCod[i]=n;
    cod[i]=codZ;
}

const long long infinit = LONG_LONG_MAX;
int celMaiMicNod()
{
    long long m = infinit;
    int p;
    for(int j=0; j<2; j++)
    {
        if(nod[c[j].i[c[j].s]].v < m && c[j].s<=c[j].d)
        {
            p=j;
            m=nod[c[j].i[c[j].s]].v;
        }
    }
    return c[p].i[c[p].s++];
}

void construiesteCoadaNodurilorInterne()
{
    while(c[0].s+c[1].s <= c[0].d+c[1].d)
    {
        Nod p;
        p.f[0] = celMaiMicNod();
        p.f[1] = celMaiMicNod();
        p.v = nod[p.f[0]].v + nod[p.f[1]].v;
        lg += p.v;
        nod[n] = p;
        c[1].i[++c[1].d] = n++;
    }
}

int main()
{
    ifstream fin("huffman.in");
    fin >> n;
    int k = n;
    c[0].s = 0;
    c[0].d = -1;
    for(int i=0; i<n; i++)
    {
        fin >> nod[i].v;
        nod[i].f[0] = -1;
        nod[i].f[1] = -1;
        c[0].i[++c[0].d] = i;
    }
    c[1].s = 0;
    c[1].d = -1;
    construiesteCoadaNodurilorInterne();
    parcurgereInAdancime(c[1].i[c[1].s++], 0, 0);
    ofstream fout("huffman.out");
    fout << lg << '\n';
    for(int i=0; i<k; i++)
        fout << lCod[i] << ' ' << cod[i] << '\n';
    return 0;
}