Pagini recente » Cod sursa (job #2590883) | Cod sursa (job #1760921) | Cod sursa (job #3254612) | Cod sursa (job #1707896) | Cod sursa (job #640176)
Cod sursa(job #640176)
#include <cstdio>
#include <queue>
using namespace std;
const int N=1000001;
struct nod{
int poz;
int val;
nod *left,*right;
}*R;
int n,textsize,initial[N];
long long code[N],rez;
short int length[N];
queue<nod *>Q1,Q2;
inline nod* extractmin(){
nod* minim;
if(Q2.empty()){
minim=Q1.front();
Q1.pop();
return minim;
}
if(Q1.empty()){
minim=Q2.front();
Q2.pop();
return minim;
}
if(Q2.front()->val<Q1.front()->val){
minim=Q2.front();
Q2.pop();
return minim;
}
minim=Q1.front();
Q1.pop();
return minim;
}
void Buildtree(){
int inputvalue;
int i;
freopen("huffman.in","r",stdin);
scanf("%d",&n);
for(i=1;i<=n;++i){
scanf("%d",&inputvalue);
initial[i]=inputvalue;
nod *aux;
aux=new nod;
aux->poz=i;
aux->val=inputvalue;
aux->left=NULL;
aux->right=NULL;
Q1.push(aux);
}
nod *a,*b,*aux;
for(i=1;i<n;++i){
a=extractmin();
b=extractmin();
aux=new nod;
aux->val=a->val+b->val;
aux->poz=0;
aux->left=a;
aux->right=b;
Q2.push(aux);
}
R=extractmin();
}
inline void Huffman(nod *a,long long cod,int codesize){
if(a->poz!=0){
code[a->poz]=cod;
length[a->poz]=codesize;
rez+=(initial[a->poz]*codesize);
return;
}
Huffman(a->left,cod*2,codesize+1);
Huffman(a->right,cod*2+1,codesize+1);
}
void Result(){
int i;
freopen("huffman.out","w",stdout);
printf("%lld\n",rez);
for(i=1;i<=n;++i){
printf("%d %lld\n",length[i],code[i]);
}
}
int main(){
Buildtree();
Huffman(R,0,0);
Result();
return 0;
}