Cod sursa(job #1193059)

Utilizator sebinechitasebi nechita sebinechita Data 30 mai 2014 19:36:30
Problema Coduri Huffman Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.51 kb
#include <iostream>
#include <fstream>
#include <queue>
using namespace std;
ifstream fin("huffman.in");
ofstream fout("huffman.out");
#define MAX 1000100
struct node{
    long long val;
    node *st, *dr;
    int v;
};

node *p;

queue <node*> Q1, Q2;
int n, i, x;

node* take_min()
{
    node* x;
    if(Q1.empty())
    {
        x=Q2.front();
        Q2.pop();
        return x;
    }
    if(Q2.empty())
    {
        x=Q1.front();
        Q1.pop();
        return x;
    }
    if(Q2.front()->val<Q1.front()->val)
    {
        x=Q2.front();
        Q2.pop();
        return x;
    }
    x=Q1.front();
    Q1.pop();
    return x;

}

int lg;
int ln[MAX];
long long number[MAX];
void df(node* rad, int nr)
{
    if(rad->st==rad->dr)
    {
        ln[rad->v]=lg;
        number[rad->v]=nr;
        return;
    }
    lg++;
    df(rad->st, nr*2);
    df(rad->dr, nr*2+1);
    lg--;
}

int main()
{
    fin>>n;
    for(i=1;i<=n;i++)
    {
        fin>>x;
        p=new node;
        p->val=x;
        p->v=i;
        p->st=0;
        p->dr=0;
        Q1.push(p);
    }
    node *i1, *i2;
    long long s=0;
    for(i=1;i<n;i++)
    {
        i1=take_min();
        i2=take_min();
        p=new node;
        p->val=i1->val+i2->val;
        p->st=i1;
        p->dr=i2;
        s+=p->val;
        Q2.push(p);
    }
    node* rad=take_min();
    fout<<s<<"\n";
    df(rad, 0);
    for(i=1;i<=n;i++)
    {
        fout<<ln[i]<<" "<<number[i]<<"\n";
    }

}