Pagini recente » Cod sursa (job #2918876) | Cod sursa (job #2475544) | Cod sursa (job #761318) | Cod sursa (job #1743886) | Cod sursa (job #628445)
Cod sursa(job #628445)
#include <stdio.h>
#include <stdlib.h>
#define Inf 9000000000000000000LL
typedef struct Node {
long long data;
int ind;
struct Node * left;
struct Node * right;
} Node;
short p[1000010];
long long q[1000010];
long long lg=0;
void print (Node * k,int u,long long v)
{
if (!k) return;
if (!k->left&&!k->right) {
p[k->ind]=u;
q[k->ind]=v;
lg+=u*k->data;
}
print (k->left,u+1,v<<1);
print (k->right,u+1,(v<<1)+1);
}
int main () {
FILE * in=fopen ("huffman.in","r");
FILE * out=fopen ("huffman.out","w");
short l=sizeof (Node);
int i,n,c1=0,c2=0,d2=0;
fscanf (in,"%d",&n);
Node * t,*t1,*t2,*inf;
Node ** k1=(Node**) malloc ((n+10)*4);
Node ** k2=(Node**) malloc (((n<<1)+10)*4);
for (i=0; i<n; i++) {
t=(Node*) malloc (24);
fscanf (in,"%lld",&t->data);
t->ind=i;
t->left=0;
t->right=0;
k1[i]=t;
}
k1[n]=malloc (24);
k1[n]->data=Inf;
inf=malloc (24);
inf->data=Inf;
k2[0]=inf;
while (1) {
t1=(k1[c1]->data<=k2[c2]->data ? k1[c1++] : k2[c2++]);
t2=(k1[c1]->data<=k2[c2]->data ? k1[c1++] : k2[c2++]);
if (t2->data==Inf) break;
t=(Node*) malloc (24);
t->data=t1->data+t2->data;
t->left=t1;
t->right=t2;
k2[d2++]=t;
k2[d2]=inf;
}
print (k2[c2-1],0,0);
fprintf (out,"%lld\n",lg);
for (i=0; i<n; i++) fprintf (out,"%d %lld\n",p[i],q[i]);
fclose (in);
fclose (out);
return 0;
}