Pagini recente » Cod sursa (job #831868) | Cod sursa (job #2549813) | Cod sursa (job #2359418) | Cod sursa (job #908008) | Cod sursa (job #785916)
Cod sursa(job #785916)
#include <fstream>
#include <queue>
#define MAXN 1000005
using namespace std;
ifstream f("huffman.in");
ofstream g("huffman.out");
struct nod{
int ind;
long long nrap;
nod *fiust,*fiudr;};
long long n,lg[MAXN],bin[MAXN],b,cnt;
nod *p,*q,*r,*inf;
queue<nod *> q1,q2;
nod *extragere_min();
void huffman(nod *x);
int main()
{
int i;
f>>n;
inf=new nod;
inf->nrap=2000000000000000000;
for(i=1;i<=n;i++){
p=new nod;
p->ind=i;
f>>(p->nrap);
p->fiust=p->fiudr=NULL;
q1.push(p);}
while(q1.size()+q2.size()>1){
p=extragere_min();
q=extragere_min();
r=new nod;
r->ind=0;
r->nrap=p->nrap+q->nrap;
r->fiust=p;
r->fiudr=q;
q2.push(r);}
huffman(r);
g<<lg[0]<<'\n';
for(i=1;i<=n;i++)
g<<lg[i]<<' '<<bin[i]<<'\n';
f.close();
g.close();
return 0;
}
nod *extragere_min(){
nod *a,*b;
a=b=inf;
if(!q1.empty())
a=q1.front();
if(!q2.empty())
b=q2.front();
if(a->nrap<b->nrap){
q1.pop();
return a;}
q2.pop();
return b;}
void huffman(nod *x){
if(x->ind){
lg[x->ind]=cnt;
lg[0]+=cnt*(x->nrap);
bin[x->ind]=b;
return;}
cnt++;
b*=2;
huffman(x->fiust);
b++;
huffman(x->fiudr);
cnt--;
b/=2;}