Cod sursa(job #1767663)

Utilizator cordun_cristinaCristina Maria Cordun cordun_cristina Data 29 septembrie 2016 16:18:44
Problema Coduri Huffman Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.38 kb
#include <fstream>

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

const int Nmax = 1000005;
int q1[Nmax], q2[Nmax], l1, r1, l2, r2, n, nr, level[Nmax];
long long sol, Config[Nmax];

struct graf
{
    long long frecv;
    int fiu1, fiu2;
} G[2*Nmax];

void Read()
{
    f>>n;
    for(int i = 1; i <= n; i++)
    {
        f>>G[i].frecv;
        q1[i] = i;;
    }
}

void Select(int &x)
{
    if(G[q1[l1]].frecv < G[q2[l2]].frecv) x = q1[l1++];
    else x = q2[l2++];
}

void Solve()
{
    G[0].frecv = 100000000000000000;
    l1 = l2 = 1;
    r2 = 0;
    r1 = n;
    nr = n;
    while(l1 <= r1 || l2 < r2)
    {
        int a, b;
        Select(a);
        Select(b);
        G[++nr].fiu1 = a;
        G[nr].fiu2 = b;
        G[nr].frecv = G[a].frecv + G[b].frecv;
        sol += G[nr].frecv;
        q2[++r2] = nr;
    }
}

void DFS(int i, long long config, int nivel)
{
    if(G[i].fiu1)
    {
        DFS(G[i].fiu1, (config<<1), nivel+1);
        DFS(G[i].fiu2, (config<<1)+1, nivel+1);
        return;
    }
    level[i] = nivel;
    Config[i] = config;
}

void Print()
{
    g<<sol<<'\n';
    for(int i = 1; i <= n; i++)
    {
        g<<level[i]<<' '<<Config[i]<<'\n';
    }
}

int main()
{
    Read();
    Solve();
    DFS(nr,0,0);
    Print();
    f.close();
    g.close();
    return 0;
}