Pagini recente » Cod sursa (job #2522660) | Cod sursa (job #608290) | Cod sursa (job #2547314) | Cod sursa (job #565986) | Cod sursa (job #623783)
Cod sursa(job #623783)
#include <fstream>
#include <queue>
using namespace std;
ifstream in("huffman.in");
ofstream out("huffman.out");
const int N=1000001;
struct nod{
int poz;
long long val;
nod *left,*right;
}*R;
int n,textsize,initial[N];
int code[N],length[N];
queue<nod *>Q1,Q2;
void Read(){
int i;
long long inputvalue;
in>>n;
for(i=1;i<=n;++i){
in>>inputvalue;
initial[i]=inputvalue;
nod *aux;
aux=new nod;
aux->poz=i;
aux->val=inputvalue;
aux->left=NULL;
aux->right=NULL;
Q1.push(aux);
}
}
/*inline nod* extractmin(){
nod *aux;
if(Q1.empty()){
aux=Q2.front();
Q2.pop();
return aux;
}
if(Q2.empty()){
aux=Q1.front();
Q1.pop();
return aux;
}
if(Q1.front()<Q2.front()){
aux=Q1.front();
Q1.pop();
return aux;
}
else{
aux=Q2.front();
Q2.pop();
return aux;
}
}*/
inline nod* extractmin(){
nod* minim=NULL;
if(!Q1.empty())
minim=Q1.front();
if(!Q2.empty())
{
if(minim)
{
if(minim->val>Q2.front()->val)
minim=Q2.front();
}
else
minim=Q2.front();
}
if(!Q1.empty())
{
if(minim==Q1.front())
Q1.pop();
else
Q2.pop();
}
else
Q2.pop();
return minim;
}
void Buildtree(){
int i;
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();
}
void Huffman(nod *a,int cod,int codesize){
if(a->poz!=0){
code[a->poz]=cod;
textsize+=codesize*initial[a->poz];
length[a->poz]=codesize;
return;
}
Huffman(a->left,cod*2,codesize+1);
Huffman(a->right,cod*2+1,codesize+1);
}
void Result(){
int i;
out<<textsize<<"\n";
for(i=1;i<=n;i++){
out<<length[i]<<" "<<code[i]<<"\n";
}
}
int main(){
Read();
Buildtree();
Huffman(R,0,0);
Result();
return 0;
}