Cod sursa(job #1949822)

Utilizator Train1Train1 Train1 Data 2 aprilie 2017 14:05:06
Problema Coduri Huffman Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.38 kb
#include <iostream>
#include <fstream>
#include <queue>
using namespace std;
ifstream fin("huffman.in");
ofstream fout("huffman.out");
int n;
struct nod {
    int val;
    int length;
    int nivel;
    nod *left, *right;
};
struct comp {
    bool operator() (nod *a, nod *b){
        return a->length > b->length;
    }
};
priority_queue <nod*, vector<nod*>, comp> pq;
vector <pair<int, int> > v;
void df(nod *R, int l, int s) {
    /*
    if(R == 0)
        return;
    */
    if(R->val != 0) {
        v[R->val].first = l;
        v[R->val].second = s;
    } else {
        l++;
        df(R->left, l, s);
        df(R->right, l, s + (1<<(l - 1)));
    }
}
int main()
{
    fin>>n;
    v.resize(n + 1);
    for(int i = 1; i <= n; i++) {
        nod *x = new nod;
        fin>>x->length;
        x->val = i;
        pq.push(x);

    }
    int s = 0;
    while(pq.size() > 1) {
        nod *x = pq.top();
        pq.pop();
        nod *y = pq.top();
        pq.pop();

        int k = x->length + y->length;
        nod *t = new nod;
        t->left = x;
        t->right = y;
        t->length = k;
        t->val = 0;
        s += k;
        pq.push(t);
    }
    fout<<s<<'\n';
    df(pq.top(), 0, 0);
    for(int i = 1; i <= n; i++) {
        fout<<v[i].first<<' '<<v[i].second<<'\n';
    }
    fin.close();
    fout.close();
    return 0;
}