Cod sursa(job #2617931)

Utilizator stefanpiturStefan Alexandru Pitur stefanpitur Data 23 mai 2020 12:55:13
Problema Coduri Huffman Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.45 kb
#include <iostream>
#include <fstream>
#include <queue>
using namespace std;

ifstream fin("huffman.in");
ofstream fout("huffman.out");

const int N = 1000000;

queue <int> q1, q2;

int size1, size2;
int p1, p2;
int code[2*N + 1];
int st[2*N + 1], dr[2*N + 1];
int n, cn;

int sum;
void adauga_nod(int x, int y){
    code[++n] = code[x] + code[y];
    sum += code[n];
    st[n] = x, dr[n] = y;
    q2.push(n);
}

int get_min(){
    int ans;
    if((int)q1.size()){
        if((int)q2.size()){
            if(code[q1.front()] < code[q2.front()]){
                ans = q1.front();
                q1.pop();
            }
            else{
                ans = q2.front();
                q2.pop();
            }
        }
        else{
            ans = q1.front();
            q1.pop();
        }
    }
    else{
        ans = q2.front();
        q2.pop();
    }
    return ans;
}


void dfs(int node, int depth, int val){
    if(st[node] == 0 && dr[node] == 0){  //frunza
        fout << depth << " " << val << "\n";
        return;
    }
    sum += code[node];
    dfs(st[node], depth + 1, val * 2);
    dfs(dr[node], depth + 1, val * 2 + 1);
}

int main()
{
    int i,e1,e2;
    fin >> n;
    cn = n;
    for(i=1; i<=n; i++){
        fin >> code[i];
        q1.push(i);
    }
    p1 = p2 = 1;
    while((int)q1.size() + (int)q2.size() > 1){
        e1 = get_min();
        e2 = get_min();
        adauga_nod(e1, e2);
    }
    fout << sum << "\n";
    dfs(n, 0, 0);
    return 0;
}