Cod sursa(job #782677)

Utilizator stefanzzzStefan Popa stefanzzz Data 28 august 2012 18:08:41
Problema Coduri Huffman Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.48 kb
#include <fstream>
#include <queue>
#define MAXN 1000005
using namespace std;
ifstream f("huffman.in");
ofstream g("huffman.out");

struct nod{
    int ind;
    long long nrap;
    nod *fiust,*fiudr;};

long long n,lg[MAXN],bin[MAXN],b,cnt;
nod *p,*q,*r;
queue<nod *> q1,q2;

nod *extragere_min();
void huffman(nod *x);

int main()
{
    int i;
    f>>n;
    for(i=1;i<=n;i++){
        p=new nod;
        p->ind=i;
        f>>(p->nrap);
        p->fiust=p->fiudr=NULL;
        q1.push(p);}
    while(q1.size()+q2.size()>1){
        p=extragere_min();
        q=extragere_min();
        r=new nod;
        r->ind=0;
        r->nrap=p->nrap+q->nrap;
        r->fiust=p;
        r->fiudr=q;
        q2.push(r);}
    huffman(r);
    g<<lg[0]<<'\n';
    for(i=1;i<=n;i++)
        g<<lg[i]<<' '<<bin[i]<<'\n';
    f.close();
    g.close();
    return 0;
}

nod *extragere_min(){
    nod *a,*b;
    if(q1.empty()||q2.empty()){
        if(q1.empty()){
            a=q2.front();
            q2.pop();}
        else{
            a=q1.front();
            q1.pop();}
        return a;}
    a=q1.front();
    b=q2.front();
    if(a->nrap<b->nrap){
        q1.pop();
        return a;}
    q2.pop();
    return b;}

void huffman(nod *x){
    if(x->ind){
        lg[x->ind]=cnt;
        lg[0]+=cnt*(x->nrap);
        bin[x->ind]=b;
        return;}
    cnt++;
    b*=2;
    huffman(x->fiust);
    b++;
    huffman(x->fiudr);
    cnt--;
    b/=2;}