Cod sursa(job #1121698)

Utilizator crisbodnarCristian Bodnar crisbodnar Data 25 februarie 2014 13:42:36
Problema Coduri Huffman Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.25 kb
#include <iostream>
#include <fstream>
#include <algorithm>
#include <vector>
#include <queue>

using namespace std;

ifstream fin("huffman.in");
ofstream fout("huffman.out");

const int NMAX = 1e6 + 100;

int N, lgmin, top, V[NMAX * 2], LG[NMAX], C[NMAX];
typedef pair<int, int> node;
node fiu[NMAX * 2];
priority_queue <node, vector<node>, greater<node> > Q;

void DFS(int nod, long long lev, long long code)
{
    if(nod > N)
    {
        lgmin += V[nod];
        DFS(fiu[nod].first, lev + 1, code << 1);
        DFS(fiu[nod].second, lev + 1, (code << 1) + 1);
    }
    else
    {
        LG[nod] = lev;
        C[nod] = code;
    }
}

int main()
{
    fin >> N;
    for(int i = 1; i <= N; i++)
    {
        fin >> V[i];
        Q.push(node(V[i], i));
    }

    int min1, min2, T; top = N;
    while(Q.size() > 1)
    {
        min1 = Q.top().second; Q.pop();
        min2 = Q.top().second; Q.pop();
        V[++top] = V[min1] + V[min2];
        fiu[top].first = min1;
        fiu[top].second = min2;
        Q.push(node(V[top], top));
    }

    T = Q.top().second; Q.pop();
    DFS(T, 0, 0);

    fout << lgmin << '\n';
    for(int i = 1; i <= N; i++)
        fout << LG[i] << ' ' <<C[i] << '\n';
    return 0;
}