Pagini recente » Cod sursa (job #746546) | Cod sursa (job #1230532) | Cod sursa (job #3202238) | Cod sursa (job #1295938) | Cod sursa (job #603927)
Cod sursa(job #603927)
#include<stdio.h>
#define maxN 1000005
FILE*f=fopen("huffman.in","r");
FILE*g=fopen("huffman.out","w");
int n,i,j,fr,pc = 1,uc,pq = 1,uq;
long long value[maxN],lg[maxN],Lg;
struct nod{
long long fr;
int ind;
nod *son[2];
nod () {
fr = ind = 0; son[0] = son[1] = NULL;
}
};
nod *C[maxN],*Q[maxN],*M[2];
inline void citire () {
fscanf(f,"%d",&n); uc = n;
for ( i = 1 ; i <= n ; ++i ){
fscanf(f,"%d",&fr);
C[i] = new nod;
C[i]->fr = fr;
C[i]->ind = i;
}
}
void DFS ( nod *p , int niv , long long val ){
if ( p->ind ){
value[p->ind] = val; lg[p->ind] = niv;
Lg += (1LL*niv*(p->fr));
return ;
}
for ( int j = 0 ; j < 2 ; ++j ){
if ( p->son[j] != NULL )
DFS ( p->son[j] , niv + 1 , val+val+j );
}
}
inline void solve () {
for ( i = 1 ; i < n ; ++i ){
for ( j = 0 ; j < 2 ; ++j ){
if ( pc <= uc && (pq > uq || C[pc]->fr <= Q[pq]->fr) )
M[j] = C[pc++];
else
M[j] = Q[pq++];
}
++uq; Q[uq] = new nod;
Q[uq]->fr = M[0]->fr + M[1]->fr;
Q[uq]->son[0] = M[0]; Q[uq]->son[1] = M[1];
}
DFS( Q[pq] , 0 , 0 );
fprintf(g,"%lld\n",Lg);
for ( i = 1 ; i <= n ; ++i ){
fprintf(g,"%d ",lg[i]);
fprintf(g,"%lld\n",value[i]);
}
}
int main () {
citire();
solve();
fclose(f);
fclose(g);
return 0;
}