Cod sursa(job #1033700)

Utilizator misu007Pogonaru Mihai misu007 Data 17 noiembrie 2013 14:45:37
Problema Coduri Huffman Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 2.61 kb
#include <cstdio>
#include <queue>
using namespace std;

int n,a[1000000];
unsigned long long b[1000000],lg;

struct nod
{
    nod *s,*d;
    int x;
    unsigned long long y;
}*h[1000000];

queue<nod*> q1,q2;

void init(int i)
{
    h[i]=new nod;
    h[i]->s='\0';
    h[i]->d='\0';
    h[i]->x=i;
}

void read()
{
    freopen("huffman.in","r",stdin);
    scanf("%d",&n);
    for(int i=0;i<n;++i)
    {
        init(i);
        scanf("%llu",&h[i]->y);
        lg+=h[i]->y;
        q1.push(h[i]);
    }
}

void creare_arbore()
{
    char e=0;
    nod *n1,*n2,*nou;
    while(!e)
    {
        if(!q1.empty()&&!q2.empty())
        {
            if(q2.front()->y<q1.front()->y)
            {
                n1=q2.front();
                q2.pop();
            }
            else
            {
                n1=q1.front();
                q1.pop();
            }
        }
        else
        {
            if(q1.empty())
            {
                n1=q2.front();
                q2.pop();
            }
            else
            {
                n1=q1.front();
                q1.pop();
            }
        }
        if(!q1.empty()&&!q2.empty())
        {
            if(q2.front()->y<q1.front()->y)
            {
                n2=q2.front();
                q2.pop();
            }
            else
            {
                n2=q1.front();
                q1.pop();
            }
        }
        else
        {
            if(q1.empty())
            {
                if(q2.empty()) e=1;
                else
                {
                    n2=q2.front();
                    q2.pop();
                }
            }
            else
            {
                n2=q1.front();
                q1.pop();
            }
        }
        if(e) h[0]=n1;
        else
        {
            nou=new nod;
            nou->s=n1;
            nou->d=n2;
            nou->x=-1;
            nou->y=n1->y+n2->y;
            lg+=nou->y;
            q2.push(nou);
        }
    }
}

void codare(nod *n,int x,unsigned long long y,unsigned long long z)
{
    if(n->x!=-1)
    {
        a[n->x]=x;
        b[n->x]=y;
    }
    else
    {
        codare(n->s,x+1,y,z*2);
        codare(n->d,x+1,y+z,z*2);
    }
}

void huffman()
{
    creare_arbore();
    codare(h[0],0,0,1);
}

void write()
{
    freopen("huffman.out","w",stdout);
    printf("%llu\n",lg-h[0]->y);
    for(int i=0;i<n;++i)
    {
        printf("%d %llu\n",a[i],b[i]);
    }
}

int main()
{
    read();
    huffman();
    write();
    return 0;
}