Cod sursa(job #1523697)

Utilizator serbanSlincu Serban serban Data 13 noiembrie 2015 00:09:36
Problema Coduri Huffman Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.46 kb
#include <bits/stdc++.h>

using namespace std;

struct node{
    node *ls = NULL;
    node *rs = NULL;
    long long inf = 0;
    int poz = 0;
};

long long n, v;
priority_queue< pair<long long, node *> > q;

pair<long long, long long> b[1000005];
long long fg[1000005];

void dfs(node *start, int p, int niv) {
    if(start->poz) {
        b[start->poz].first = niv;
        b[start->poz].second = p;
        fg[start->poz] = start->inf;
        return ;
    }
    dfs(start->ls, p, niv + 1);
    dfs(start->rs, p | (1 << niv), niv + 1);
}

int main()
{
    FILE *f = fopen("huffman.in", "r");
    FILE *g = fopen("huffman.out", "w");

    fscanf(f, "%lld", &n);

    for(int i = 1; i <= n; i ++) {
        node *p = new node;
        p->poz = i;
        fscanf(f, "%lld", &p->inf);
        q.push(make_pair(-p->inf, p));
    }

    while(q.size() > 0) {
        node *fst = q.top().second;
        q.pop();
        node *snd = q.top().second;
        q.pop();

        node *aux = new node;
        aux->rs = fst;
        aux->ls = snd;
        aux->inf = fst->inf + snd->inf;
        q.push(make_pair(-aux->inf, aux));
    }

    node *start = q.top().second;
    dfs(start, 0, 0);

    long long s = 0;
    for(int i = 1; i <= n; i ++) {
        s += b[i].first * fg[i];
    }
    fprintf(g, "%lld\n", s);
    for(int i = 1; i <= n; i ++) {
        fprintf(g, "%lld %lld\n", b[i].first, b[i].second);
    }
    return 0;
}