Pagini recente » Cod sursa (job #2397546) | Cod sursa (job #3156875) | Cod sursa (job #1295302) | Cod sursa (job #1972583) | Cod sursa (job #628414)
Cod sursa(job #628414)
#include <stdio.h>
#include <stdlib.h>
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 () {
freopen ("huffman.in","r",stdin);
freopen ("huffman.out","w",stdout);
int i,n,c1=0,c2=0,d2=0;
scanf ("%d",&n);
Node * t,*t1,*t2;
Node ** k1=(Node**) malloc ((n+10)*sizeof (Node *));
Node ** k2=(Node**) malloc (((n<<1)+10)*sizeof (Node *));
for (i=0; i<n; i++) {
t=(Node*) malloc (sizeof (Node));
scanf ("%lld",&t->data);
t->ind=i;
t->left=0;
t->right=0;
k1[i]=t;
}
while (1) {
if (c1==n) {
t1=k2[c2++];
if (c2<d2) t2=k2[c2++];
else break;
}
else
if (c2<d2)
if (k1[c1]->data<=k2[c2]->data) {
t1=k1[c1++];
if (c1<n)
if (k1[c1]->data<=k2[c2]->data) t2=k1[c1++];
else t2=k2[c2++];
else t2=k2[c2++];
}
else {
t1=k2[c2++];
if (c2<d2)
if (k1[c1]->data<=k2[c2]->data) t2=k1[c1++];
else t2=k2[c2++];
else t2=k1[c1++];
}
else {
t1=k1[c1++];
t2=k1[c1++];
}
t=(Node*) malloc (sizeof (Node));
t->data=t1->data+t2->data;
t->left=t1;
t->right=t2;
k2[d2++]=t;
}
print (k2[c2-1],0,0);
printf ("%lld\n",lg);
for (i=0; i<n; i++) printf ("%d %lld\n",p[i],q[i]);
fclose (stdin); fclose (stdout);
return 0;
}