Cod sursa(job #1236065)

Utilizator Kira96Denis Mita Kira96 Data 1 octombrie 2014 12:03:53
Problema Coduri Huffman Scor 90
Compilator cpp Status done
Runda Arhiva educationala Marime 1.26 kb
#include<cstdio>
#define N 1000100
#include<fstream>
#include<queue>
#define FOR(a,b,c) for(register int a=b;a<=c;++a)
using namespace std;
ifstream f("huffman.in");
long long val[N],LG;
int lg[N],n,fr,csiz,qsiz;
struct nod
{
    nod *l,*r;
    long long fre;
    int ind;
    nod() {}
    nod(int _ind,long long _fre,nod* _l,nod *_r)
    {
        ind=_ind;
        fre=_fre;
        l=_l;
        r=_r;
    }
};
nod *M[2];
queue<nod* > q,c;
void dfs(nod* x,int lvl,long long va)
{
    if(x->ind)
    {
        lg[x->ind]=lvl;
        val[x->ind]=va;
        LG+=x->fre*lvl;
        return;
    }
    if(x->l)
    dfs(x->l,lvl+1,va<<1);
    if(x->r)
    dfs(x->r,lvl+1,(va<<1)+1);
}
int main ()
{
    freopen("huffman.out","w",stdout);
    f>>n;
    csiz=n;
    FOR(i,1,n)
    {
        f>>fr;
        c.push(new nod(i,fr,NULL,NULL));
    }
    FOR(i,1,n-1)
    {
    FOR(j,0,1)
    {
        if(csiz&&(!qsiz||c.front()->fre<=q.front()->fre))
        M[j]=c.front(),c.pop(),--csiz;
        else
        M[j]=q.front(),q.pop(),--qsiz;

    }
    q.push(new nod(0,M[0]->fre+M[1]->fre,M[0],M[1])),++qsiz;
    }
    dfs(q.front(),0,0);
    printf("%lld\n",LG);
    FOR(i,1,n)
    printf("%d %lld\n",lg[i],val[i]);
    return 0;
}