Pagini recente » Cod sursa (job #1990672) | Cod sursa (job #1968331) | Cod sursa (job #1325944) | Cod sursa (job #1651340) | Cod sursa (job #1374376)
#include<cstdio>
#define INF (1LL<<62)-1
struct huff{
long long a;
int v[2];
}v[2001000];
int n,m,i,j,poz,x[2][1001000],u[2],p[2];
long long y[1001000],z[1001000],vmin,s;
FILE *f,*g;
void dfs(int nod, int niv,long long val){
if( v[nod].v[0] ){
dfs( v[nod].v[0], niv+1, val*2 );
dfs( v[nod].v[1], niv+1, val*2+1 );
return;
}
y[nod]=niv;
z[nod]=val;
}
int main(){
f=fopen("huffman.in","r");
g=fopen("huffman.out","w");
fscanf(f,"%d",&n);
for(i=1;i<=n;i++){
fscanf(f,"%lld",&v[i].a);
x[0][i]=i;
}
p[0]=p[1]=1;
m=u[0]=n;
while(p[0]+p[1]<=u[0]+u[1]){
m++;
for(i=0;i<=1;i++){
vmin=INF;
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;
poz=j;
}
}
v[m].a+=vmin;
v[m].v[i]=x[poz][ p[poz] ];
p[poz]++;
}
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;
}