Cod sursa(job #1073576)

Utilizator CatalinaRaduCatalina Elena Radu CatalinaRadu Data 6 ianuarie 2014 16:13:52
Problema Coduri Huffman Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.24 kb
#include <iostream>
#include <fstream>

using namespace std;

#define MaxN 1000100
#define inf (1<<30)

ifstream f ("huffman.in");
ofstream g ("huffman.out");

struct nod
{
    int v;
    int leg[2];
}nod[2*MaxN];

int n,viz[MaxN];
long  lmax, lung[MaxN],baza[MaxN];

void depthf (long pos, long cod, long nivel)
{
    if (nod[pos].leg[0])
    {
        depthf(nod[pos].leg[0],cod*2,nivel+1);
        depthf(nod[pos].leg[1],cod*2+1,nivel+1);

    }
    lung[pos]=nivel;
    baza[pos]=cod;
}

void solve()
{
    long k=n;int i,j,p;
    for(i=0;i<n;i++)
    {
        k++;
        for (j=0;j<2;j++)
        {
            p=0;
            long minim=inf;
            for(int y=1;y<k;y++)
                if(nod[y].v<minim&& !viz[y])
                {
                    p=y;
                    minim=nod[y].v;
                }
            viz[p]=1;
            nod[k].leg[j]=p;
            nod[k].v+=nod[p].v;
        }
        lmax+=nod[k].v;

    }
    depthf(k,0,0);
}

int main()
{
    f>>n;
    int i;
    for (i=1;i<=n;i++)
        f>>nod[i].v;

    solve();
    g<<lmax<<'\n';
    for(i=1;i<=n;i++)
        g<<lung[i]<<' '<<baza[i]<<'\n';
    f.close();
    g.close();
    return 0;
}