Pagini recente » Cod sursa (job #1091583) | Cod sursa (job #3295381) | Cod sursa (job #1980601) | Cod sursa (job #491101) | Cod sursa (job #1217728)
#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;
}