Pagini recente » Cod sursa (job #2147633) | Clasament simulare-cartita-28 | Cod sursa (job #1913671) | Istoria paginii runda/oni2013_baraj | Cod sursa (job #2277422)
#include<stdio.h>
#include<stdlib.h>
#include<vector>
#include<queue>
#include<set>
using namespace std;
#define NMAX 1000000
long long b[NMAX];
unsigned char lg[NMAX];
long long lung;
typedef struct nod{
int left, right;
long long freq;
}nod;
nod huff[2*NMAX]; // arborele Huffman
queue<int> freq0;
queue<int> freq1;
int N;
void deepfirst(int root,long long cod,int nivel){
if(huff[root].right) {
deepfirst(huff[root].left, cod<<1, nivel+1);
deepfirst(huff[root].right, (cod<<1)+1, nivel+1);
return;
}
lg[root]=nivel;
b[root]=cod;
}
void huffman(){
int n=N;
int IND[2];
while(n<(2*N-1)){
long long cost=0;
for(int i=0;i<2;i++){
if(!freq0.empty()){
if(freq1.empty()){
IND[i]=freq0.front(); freq0.pop();
}
else{
if(huff[freq0.front()].freq<huff[freq1.front()].freq){
IND[i]=freq0.front(); freq0.pop();
}
else{
IND[i]=freq1.front(); freq1.pop();
}
}
}
else{
IND[i]=freq1.front(); freq1.pop();
}
}
huff[n].left=IND[0]; huff[n].right=IND[1];
huff[n].freq=huff[IND[0]].freq+huff[IND[1]].freq;
freq1.push(n);
lung+=huff[n].freq;
n++;
}
printf("%lld\n",lung);
deepfirst(n-1,0,0);
}
int main(){
freopen("huffman.in","rt",stdin);
freopen("huffman.out","wt",stdout);
scanf("%d",&N);
int f;
for(int i=0;i<N;i++){
scanf("%d",&f);
huff[i].freq=f;
freq0.push(i);
}
huffman();
for(int i=0;i<N;i++)
printf("%d %lld\n",lg[i],b[i]);
return 0;
}