Cod sursa(job #2250292)

Utilizator danielsociuSociu Daniel danielsociu Data 30 septembrie 2018 13:36:19
Problema Coduri Huffman Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.12 kb
#include <fstream>
std::ifstream cin("huffman.in");
std::ofstream cout("huffman.out");
using namespace std;
#define maxn 1000002
#define inf 200000000
int n;
long long sol;
long b[maxn],lg[maxn],f[maxn];
struct nod{
    long long v;
    long f[2];
}nod[maxn*2];

void df(long poz, long long cod, long nivel){
    if(nod[poz].f[0]){
        df(nod[poz].f[0],cod*2,nivel+1);
        df(nod[poz].f[1],cod*2+1,nivel+1);
        return;

    }
    lg[poz]=nivel;
    b[poz]=cod;
}

void codHuffman(){
    int r=n,poz;
    long minim=inf;
    for(int i=1;i<n;i++){
        r++;
        for(int j=0;j<2;j++){
            minim=inf;
            for(int k=1;k<r;k++)
                if(nod[k].v<minim&&!f[k]){
                    minim=nod[k].v;
                    poz=k;
                }
            nod[r].f[j]=poz;
            nod[r].v+=minim;
            f[poz]=1;
        }
        sol+=nod[r].v;
    }
    df(r,0,0);
}

int main()
{
	cin>>n;
	for(int i=1;i<=n;i++){
        cin>>nod[i].v;
	}
	codHuffman();
	cout<<sol<<'\n';
	for(int i=1;i<=n;i++){
        cout<<lg[i]<<' '<<b[i]<<'\n';
	}
}