Cod sursa(job #1105502)

Utilizator mlupseLupse-Turpan Mircea mlupse Data 11 februarie 2014 20:47:34
Problema Coduri Huffman Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.54 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=Q1.front();
        if(!Q2.empty())
            {
                B=Q2.front();
                if(F[A]<=F[B])
                    return A;
                else
                    return B;
            }
        else
        return A;
        }
    else
    {
        if(!Q2.empty())
            {
                B=Q2.front();
                return B;
            }
        else
            return 0;
    }
}

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()
{
    int A,B;
    for(Nr=N;(A=Pop())&&(B=Pop());)
        {
            ++Nr;
            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;
}