Cod sursa(job #1214268)

Utilizator iordache.bogdanIordache Ioan-Bogdan iordache.bogdan Data 29 iulie 2014 22:36:14
Problema Coduri Huffman Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.28 kb
#include <fstream>
#define INF 1000000000
#define DIMN 1000001

using namespace std;

ifstream f("huffman.in");
ofstream g("huffman.out");

int n, poz;

struct huff {
    int val;
    int fii[2];
} v[DIMN<<1];

int Cod[DIMN], Min, sol;

int l[DIMN], p[DIMN], u[DIMN], q[2][DIMN];

void DFS (int nod, int niv, int cod) {
    if (v[nod].fii[0] != 0) {
        DFS (v[nod].fii[0], niv+1, cod*2);
        DFS (v[nod].fii[1], niv+1, cod*2+1);
        return;
    }
    l[nod] = niv;
    Cod[nod] = cod;
}

int main () {
    f >> n;
    for (int i=1; i<=n; ++i) {
        f >> v[i].val;
        q[0][i] = i;
    }
    int nn = n;
    p[0] = p[1] = 1;
    u[0] = n;
    while (p[0] + p[1] <= u[0] + u[1]) {
        ++n;
        for (int i=0; i<=1; ++i) {
            Min = INF;
            for (int j=0; j<=1; ++j)
                if (p[j] <= u[j] && Min > v[q[j][p[j]]].val) {
                    Min = v[q[j][p[j]]].val;
                    poz = j;
                }
            v[n].val += Min;
            v[n].fii[i] = q[poz][p[poz]];
            ++p[poz];
        }
        sol += v[n].val;
        q[1][++u[1]] = n;
    }
    DFS (n, 0, 0);
    g << sol << "\n";
    for (int i=1; i<=nn; ++i)
        g << l[i] << " " << Cod[i] << "\n";
    return 0;
}