Pagini recente » Cod sursa (job #857204) | Cod sursa (job #729052) | Cod sursa (job #705310) | Cod sursa (job #1051259) | Cod sursa (job #481979)
Cod sursa(job #481979)
#include <stdio.h>
#include <stdlib.h>
typedef struct _nod
{
int val;
struct _nod * t;
int branch;
} nod;
nod * hp[1000000];
int nhp;
void hp_swap(int a, int b)
{
nod * aux = hp[a];
hp[a]=hp[b];
hp[b]=aux;
}
void hp_up(int i)
{
while (i)
{
int pos = ((i+1)>>1)-1;
if (hp[i]->val>=hp[pos]->val)
break;
hp_swap(i,pos);
i=pos;
}
}
void hp_down(int i)
{
while (1)
{
int p1=(i<<1)+1;
int p2=(i<<1)+2;
int min=i;
if ((p1<nhp)&&(hp[p1]->val<hp[min]->val))
min=p1;
if ((p2<nhp)&&(hp[p2]->val<hp[min]->val))
min=p2;
if (min==i)
break;
hp_swap(min,i);
i=min;
}
}
nod * hp_popmin()
{
nod * res = hp[0];
hp_swap(0,--nhp);
hp_down(0);
return res;
}
void hp_push(nod * val)
{
hp[nhp++]=val;
hp_up(nhp-1);
}
FILE *fin;
FILE *fout;
nod a[1000000];
nod t[1000000];
int nt=0;
long long b[1000000];
int lg[1000000];
int main (int argc, char * const argv[]) {
int n,i;
fin=fopen("huffman.in","r");
fout=fopen("huffman.out","w");
fscanf(fin, "%d", &n);
nhp=n;
for (i=0; i<n; i++)
{
fscanf(fin, "%d", &a[i].val);
a[i].t=NULL;
hp[i]=a+i;
}
for (i=0; i<n-1; i++)
{
nod * min1 = hp_popmin();
nod * min2 = hp_popmin();
min1->branch=0;
min2->branch=1;
nod * tata = &t[nt++];
tata->val=min1->val+min2->val;
tata->t=NULL;
min1->t=tata;
min2->t=tata;
hp_push(tata);
}
long long sum=0;
for (i=0; i<n; i++)
{
nod * p = &a[i];
int lng=0;
long long nr=0;
while (p->t)
{
nr|=((p->branch)<<lng);
lng++;
p=p->t;
}
if (!lng)
lng=1;
b[i]=nr;
lg[i]=lng;
sum+=((long long)lng)*(a[i].val);
}
fprintf(fout, "%lld\n",sum);
for (i=0; i<n; i++)
fprintf(fout, "%d %lld\n",lg[i],b[i]);
fclose(fin);
fclose(fout);
return 0;
}