Cod sursa(job #2910539)

Utilizator NToniBoSSNicolae Tonitza NToniBoSS Data 22 iunie 2022 00:10:30
Problema Coduri Huffman Scor 60
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.71 kb
#include <bits/stdc++.h>
/// TONI BO$$ was here
/// #MLC

using namespace std;

struct node
{
    int val;
    int freq;
    node *leftChild;
    node *rightChild;
    bool operator <(const node &oth) const
    {
        return freq > oth.freq;
    }
};

struct Compare
{
    bool operator ()(node *x1, node *x2){
    return x1->freq > x2->freq;}
};

priority_queue <node *, vector <node *>, Compare> q;

int code[1000001], level[1000001];

void dfs(node *cur, int lev, int nr)
{
    if(cur->val)
    {
        level[cur->val] = lev;
        code[cur->val] = nr;
        return ;
    }
    dfs(cur->leftChild, lev + 1, nr << 1);
    dfs(cur->rightChild, lev + 1, (nr << 1) + 1);
}

int main()
{
    int n, i, f;
    freopen("huffman.in","r",stdin);
    freopen("huffman.out","w",stdout);
    scanf("%d", &n);
    long long sum = 0;
    for(i = 1; i <= n; i++)
    {
        scanf("%d", &f);
        node *aux = (node *) malloc(sizeof(node));
        aux->val = i;
        aux->freq = f;
        aux->leftChild = nullptr;
        aux->rightChild = nullptr;
        q.push(aux);
    }
    while(true)
    {
        node *x1 = q.top();
        q.pop();
        if(q.empty())
        {
            q.push(x1);
            break;
        }
        node *x2 = q.top();
        q.pop();
        node *x3 = (node *) malloc(sizeof(node));
        x3->val = 0;
        x3->freq = x1->freq + x2->freq;
        sum += x3->freq;
        x3->leftChild = x1;
        x3->rightChild = x2;
        q.push(x3);
    }
    printf("%lld\n", sum);
    node *start = q.top();
    dfs(start, 0, 0);
    for(i = 1; i <= n; i++)
        printf("%d %d\n", level[i], code[i]);

    return 0;
}