Cod sursa(job #824841)

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

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

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

#define MaxN 1000100
#define MaxP 3
#define ll long long

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

inline void init(nod *& a,ll 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,(ll)a,i);
        Q.push(make_pair(1LL*-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;
        Q.pop();
        nou->dr = Q.top().second;
        Q.pop();
        nou->info = nou->st->info + nou->dr->info;
        nou->poz = 0;
        Sol += nou->info;
        Q.push(make_pair(-nou->info,nou));
    }

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

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

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