Pagini recente » Cod sursa (job #1199344) | Cod sursa (job #421214) | Cod sursa (job #1566746) | Cod sursa (job #1120814) | Cod sursa (job #782674)
Cod sursa(job #782674)
#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;};
int n,lg[MAXN],bin[MAXN],b,cnt;
nod *p,*q,*r;
queue<nod *> q1,q2;
nod *extragere_min();
void huffman(nod *x);
int main()
{
int i;
f>>n;
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;
if(q1.empty()||q2.empty()){
if(q1.empty()){
a=q2.front();
q2.pop();}
else{
a=q1.front();
q1.pop();}
return a;}
a=q1.front();
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;}