Cod sursa(job #824837)

Utilizator maritimCristian Lambru maritim Data 26 noiembrie 2012 23:26:09
Problema Coduri Huffman Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.4 kb
#include<stdio.h>
#include<queue>
using namespace std;

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

typedef struct _nod
{
    int info,poz;
    _nod *st,*dr;
} nod;

#define MaxN 1000100
#define MaxP 3

int N,Sol,SolV[MaxN][MaxP];
priority_queue<pair<int,nod*> > Q;

inline void init(nod *& a,int info,int i)
{
    a->info = info;
    a->poz = i;
    a->st = a->dr = NULL;
}

void citire(void)
{
    int a;

    fscanf(f,"%d ",&N);
    for(int i=1;i<=N;i++)
    {
        fscanf(f,"%d",&a);
        nod *b = new nod;
        init(b,a,i);
        Q.push(make_pair(-a,b));
    }
}

inline void creare(nod *a,int depth,int nr)
{
    if(!a)
        return ;

    SolV[a->poz][1] = depth;
    SolV[a->poz][2] = nr;

    creare(a->st,depth+1,nr*2);
    creare(a->dr,depth+1,nr*2+1);
}

void Rezolvare(void)
{
    for(int i=1;i<N;i++)
    {
        nod *nou = new nod;
        nou->st = Q.top().second;
        //printf("%d ",Q.top().second->info);
        Q.pop();
        nou->dr = Q.top().second;
        //printf("%d ",Q.top().second->info);
        Q.pop();
        nou->info = nou->st->info + nou->dr->info;
        Sol += nou->info;
        //printf("%d\n",nou->info);
        Q.push(make_pair(-nou->info,nou));
    }

    creare(Q.top().second,0,0);
}

int main()
{
    citire();
    Rezolvare();

    fprintf(g,"%d\n",Sol);
    for(int i=1;i<=N;i++)
        fprintf(g,"%d %d\n",SolV[i][1],SolV[i][2]);
}