Cod sursa(job #1217728)

Utilizator TarabanDragosTaraban Dragos-Petru TarabanDragos Data 8 august 2014 01:07:29
Problema Coduri Huffman Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.26 kb
#include<cstdio>
#include<climits>
int n,m,i,j,a,x[2][1000100],p[2],u[2];
long long s,vmin=LLONG_MAX,y[1000100],z[1000100];
struct dat{
    long long a;
    int b[2];
}v[2001000];
FILE *f,*g;
void dfs(int nod, int niv, long long q){
    if(v[nod].b[0]!=0){
        dfs(v[nod].b[0],niv+1,q*2);
        dfs(v[nod].b[1],niv+1,q*2+1);
        return;
    }
    y[nod]=niv;
    z[nod]=q;
}
int main(){
    f=fopen("huffman.in","r");
    g=fopen("huffman.out","w");
    fscanf(f,"%d",&n);
    for(i=1;i<=n;i++){
        fscanf(f,"%d",&v[i].a);
        x[0][i]=i;
    }
    p[0]=p[1]=1;
    u[0]=n;
    m=n;
    while(p[0]+p[1]<=u[0]+u[1]){
        m++;
        for(i=0;i<=1;i++){
            vmin=LLONG_MAX;
            for(j=0;j<=1;j++){
                if(p[j]<=u[j]&&vmin>v[x[j][p[j]]].a){
                    vmin=v[x[j][p[j]]].a;
                    a=j;
                }
            }
            v[m].a+=vmin;
            v[m].b[i]=x[a][p[a]];
            p[a]++;
        }
        s+=v[m].a;
        u[1]++;
        x[1][u[1]]=m;
    }
    fprintf(g,"%lld\n",s);
    dfs(m,0,0);
    for(i=1;i<=n;i++){
        fprintf(g,"%d ",y[i]);
        fprintf(g,"%lld\n",z[i]);
    }




    fclose(f);
    fclose(g);
    return 0;
}