Cod sursa(job #1105473)

Utilizator mlupseLupse-Turpan Mircea mlupse Data 11 februarie 2014 20:24:05
Problema Coduri Huffman Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.41 kb
#include <fstream>
#define NMax 1000005
#define oo (1<<30)
#include <queue>
using namespace std;
ifstream fin("huffman.in");
ofstream fout("huffman.out");

int Fiu[2*NMax][2];
queue <int> Q1,Q2;
int N,Nr,L[2*NMax],C[2*NMax];
long long F[2*NMax],Sol;
void Read()
{
    fin>>N;
    for(int i=1;i<=N;i++)
         {
            fin>>F[i];
            Q1.push(i);
         }
}

inline int Pop()
{
    int A,B;
   if(!Q1.empty())
        A=F[Q1.front()];
    else
        A=oo;

   if(!Q2.empty())
        B=F[Q2.front()];
    else
        B=oo;
   if(A<=B)
    {
        Q1.pop();
        return A;
    }
    else
    {
        if(!Q2.empty())
            Q2.pop();
        return B;
    }
return oo;
}

void DFS(int Nod,int Level, int Code)
{
    if(Fiu[Nod][0])
    {
        DFS(Fiu[Nod][0],Level+1,Code<<1);
        DFS(Fiu[Nod][1],Level+1,(Code<<1)+1);
    }

    L[Nod]=Level;
    C[Nod]=Code;
}

void Solve()
{

    for(Nr=N;!Q1.empty()||Q2.size()>1;)
        {
            ++Nr;
            int A=Pop(),B=Pop();
            Q2.push(Nr);
            Fiu[Nr][0]=A;
            Fiu[Nr][1]=B;
            F[Nr]=F[A]+F[B];
            Sol+=F[Nr];
        }
    DFS(Nr,0,0);
}

void Print()
{
    fout<<Sol<<"\n";
    for(int i=1;i<=N;i++)
            fout<<L[i]<<" "<<C[i]<<"\n";
}

int main()
{
    Read();
    Solve();
    Print();
    return 0;
}