Nu aveti permisiuni pentru a descarca fisierul grader_test6.ok

Cod sursa(job #1000832)

Utilizator cosmo0093Raduta Cosmin cosmo0093 Data 23 septembrie 2013 20:06:59
Problema Coduri Huffman Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.72 kb
#include <cstdio>
#include <queue>

#define maxn 1000100

struct Node
{
    long long freq;
    int l, r;
};

long long myP[maxn][2], nr;
Node myV[2 * maxn];
std::queue<int> A, B;
int nV;

int extract();
void dfs(int nod, int s, long long d);

int main()
{
    freopen("huffman.in", "r", stdin);
    freopen("huffman.out", "w", stdout);

    scanf("%d", &nV);

    for(int i = 0; i < nV; i++)
        scanf("%lld", &myV[i].freq), A.push(i);

    int c = nV;

    int a, b;

    while(true)
    {
        a = extract();
        b = extract();
        if(b == -1)
            break;
        else
        {
            myV[c].freq = myV[a].freq + myV[b].freq;
            myV[c].l = a;
            myV[c].r = b;
            B.push(c);
            c++;
        }
    }

    nr = 0;

    dfs(a, 0, 0);

    printf("%lld\n", nr);

    for(int i = 0; i < nV; i++)
        printf("%lld %lld\n", myP[i][0], myP[i][1]);

    return 0;
}

void dfs(int nod, int s, long long d)
{
    if(nod < nV)
    {
        myP[nod][0] = s;
        myP[nod][1] = d;
    }
    else
    {
        nr += myV[nod].freq;
        dfs(myV[nod].l, s + 1, d << 1);
        dfs(myV[nod].r, s + 1, (d << 1) + 1);
    }
}

int extract()
{
    int a = 0;
    if(A.empty() && B.empty())
        return -1;
    else if(A.empty())
    {
        a = B.front();
        B.pop();
        return a;
    }
    else if(B.empty())
    {
        a = A.front();
        A.pop();
        return a;
    }
    else if(myV[A.front()].freq < myV[B.front()].freq)
    {
        a = A.front();
        A.pop();
        return a;
    }
    else
    {
        a = B.front();
        B.pop();
        return a;
    }
}