Cod sursa(job #628401)

Utilizator sunt_emoSunt emo sunt_emo Data 1 noiembrie 2011 12:20:19
Problema Coduri Huffman Scor 80
Compilator c Status done
Runda Arhiva educationala Marime 2.04 kb
#include <stdio.h>
#include <stdlib.h>

typedef struct Node {
    long long data;
    int ind;
    struct Node * left;
    struct Node * right;
} Node;

int 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;
    scanf ("%d",&n);
    int d2=0;
    Node * t,*t1,*t2;
    Node ** k1=(Node**) malloc ((n+10)*sizeof (Node *));
    Node ** k2=(Node**) malloc ((2*n+10)*sizeof (Node *));
    for (i=0; i<n; i++) {
        k1[i]=(Node*) malloc (sizeof (Node));
        scanf ("%lld",&k1[i]->data);
        k1[i]->ind=i;
        k1[i]->left=0;
        k1[i]->right=0;
    }
    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;
}