Pagini recente » Cod sursa (job #2282817) | Cod sursa (job #891955) | Cod sursa (job #1486888) | Cod sursa (job #3135508) | Cod sursa (job #2250292)
#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';
}
}