Cod sursa(job #1121720)

Utilizator crisbodnarCristian Bodnar crisbodnar Data 25 februarie 2014 13:48:13
Problema Coduri Huffman Scor 65
Compilator cpp Status done
Runda Arhiva educationala Marime 1.46 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;

long long N, lgmin, top, V[NMAX * 2], LG[NMAX], C[NMAX];
typedef pair<long long, 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 Number(string s)
{
    int n = s.size(); int nr = 0;
    for(int i = 0; i < n; i++)
        nr = nr * 10 + s[i] - '0';
    return nr;
}

int main()
{
    fin >> N; fin.get(); string s;
    for(int i = 1; i <= N; i++)
    {
        getline(fin, s);
        V[i] = Number(s);
        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;
}