Cod sursa(job #2495640)

Utilizator maria15Maria Dinca maria15 Data 19 noiembrie 2019 18:31:22
Problema Coduri Huffman Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.06 kb
#include <fstream>
#include <vector>

using namespace std;

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

int n, m, i, j, v[100001], c[100001], nr[100001], w[100001], nrW, SOL;
vector<int> sol;
pair<int, pair<int, int> > H[100001];

void dfs(int nod, int cod, int niv){
    c[nod] = cod;
    nr[nod] = niv;
    if(H[nod].first != 0){
        for(int i = 0;i<2;i++){
           if(i == 0){
                int vecin = H[nod].second.first;
                dfs(vecin, (cod<<1), niv+1);
                if(H[vecin].first == 0){
                    SOL += nr[vecin]*v[vecin];
                    sol.push_back(vecin);
                }
           }
           else{
                int vecin = H[nod].second.second;
                dfs(vecin, (cod<<1) + 1, niv+1);
                if(H[vecin].first == 0){
                    SOL += nr[vecin]*v[vecin];
                    sol.push_back(vecin);
                }
           }
        }
    }
}

int main(){
    fin>>n;
    for(i=1;i<=n;i++){
        fin>>v[i];
        w[i] = 100000001;
    }
    i = j = 1;
    m = n;
    while(m < 2*n){
        if(v[i] <= w[j] && i <= n && i+1 <=n && v[i+1] <= w[j]){
       /// le iau pe primele doua primul sir
            w[++nrW] = v[i]+v[i+1];
            H[++m] = {w[nrW], {i, i+1}};
            i += 2;
        }
        else
            if((v[i] <= w[j] && i <= n && ( (i+1 <= n && v[i+1] > w[j]) || (i+1 > n) ))||(i <= n && v[i] > w[j] && ((j+1 < 2*n && w[j+1] > v[i])||(j+1 >= 2*n)))){       /// iau capetele celor doua siruri
                w[++nrW] = v[i] + w[j];
                H[++m] = {w[nrW], {i, j+n}};
                i++, j++;
            }
            else
                if(j+1 <= 2*n-1 && (i > n || (w[j] < v[i] && w[j+1] < v[i]))){
                    w[++nrW] = w[j] + w[j+1];
                    H[++m] = {w[nrW], {j+n, j+n+1}};
                    j += 2;
                }

    }
    dfs(2*n-1, 0, 0);
    fout<<SOL<<"\n";
    for(i=0;i<sol.size();i++)
        fout<<nr[sol[i]]<<" "<<c[sol[i]]<<"\n";
    return 0;
}