Cod sursa(job #603911)

Utilizator mihaipopa12Popa Mihai mihaipopa12 Data 19 iulie 2011 12:37:44
Problema Coduri Huffman Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.34 kb
#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 + (1LL << niv) * 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;
}