Cod sursa(job #534071)

Utilizator dicu_dariaDaria Dicu dicu_daria Data 15 februarie 2011 09:15:22
Problema Coduri Huffman Scor 65
Compilator cpp Status done
Runda Arhiva educationala Marime 1.06 kb
#include <fstream>
#include <queue>
#define MAXN 1000003
using namespace std;
priority_queue< pair<long long,int> >q;
pair<long long, int>x;
int n,k,i,l[MAXN];
long long b[MAXN],total;
typedef struct{
int fd,fs;
long long v;
}elem;
elem nod[2*MAXN];
void build(){
    k=n;
    while(q.size()>1)
    {
        ++k;
        x=q.top(); nod[k].v=x.first; nod[k].fs=x.second;
        q.pop();
        x=q.top(); nod[k].v+=x.first; nod[k].fd=x.second;
        q.pop();
        total+=nod[k].v;
        q.push(make_pair(nod[k].v,k));
    }
}
void walk(int poz,int cod,int nivel){
    if(nod[poz].fs){
    walk(nod[poz].fs,cod*2,nivel+1);
    walk(nod[poz].fd,cod*2+1,nivel+1);
    } else
    {
    b[poz]=cod; l[poz]=nivel;
    }

}
int main()
{
    ifstream fi("huffman.in");
    ofstream fo("huffman.out");
    fi>>n;
    for(i=1;i<=n;i++)
    {
        fi>>nod[i].v;
        q.push(make_pair(-(nod[i].v),i));
    }
    build();
    walk(k,0,0);
    fo<<-total<<"\n";
    for(i=1;i<=n;i++)
    fo<<l[i]<<" "<<b[i]<<"\n";
    return 0;
}