Pagini recente » Cod sursa (job #563044) | Cod sursa (job #2223512) | Cod sursa (job #2339974) | Cod sursa (job #2167050) | Cod sursa (job #534071)
Cod sursa(job #534071)
#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;
}