Cod sursa(job #1100075)

Utilizator superman_01Avramescu Cristian superman_01 Data 6 februarie 2014 16:27:30
Problema Coduri Huffman Scor 75
Compilator cpp Status done
Runda Arhiva educationala Marime 1.34 kb
#include <fstream>
#include <algorithm>
#include <vector>
#include <queue>

#define INF 1LL*(1<<30)
#define NMAX 1000005

using namespace std;

ifstream in ( "huffman.in" );
ofstream out ( "huffman.out" );

struct Huffman {
	int son[2];
}Nodes[2*NMAX];
int Q[2][NMAX];
long long A , B , val[2*NMAX];
int N , K,Len[NMAX] , L_f , L_r,S_f,S_r;
long long Code[NMAX] , Answer;
void Extract ( long long &V)
{
	if ( val[Q[0][L_f]] < val[Q[1][S_f]] )
		V = Q[0][L_f++];
	else
		V = Q[1][S_f++];
}
void DepthFirstSearch ( int i , long long config , int lvel )
{
	if ( Nodes[i].son[0] )
	{ 
		DepthFirstSearch ( Nodes[i].son[0] , ( config <<1 ), lvel + 1 ); 
		DepthFirstSearch ( Nodes[i].son[1] , ( config <<1 ) + 1 , lvel + 1 );
		return ;
	}
	Len[i] = lvel;
	Code[i] = config;
}

int main ( void )
{
	int i , j , x ;
	in >> N ;
	for ( i = 1 ; i <= N ; ++i )
		in >> val[i] , Q[0][i] = i ;
	K = N ;
	L_f = S_f = 1;
	L_r = N ; 
	val[0] = INF * INF ; 
	for ( ; L_f <= L_r or S_f < S_r ; )
	{
		Extract ( A );
		Extract ( B );
		Answer += val[A]+ val[B];
		Nodes[++K].son[0] = A;
		Nodes[K].son[1] = B;
		val[K] = val[A] + val[B];
		Q[1][++S_r] = K;
	}
	DepthFirstSearch ( K , 0 , 0  );
	out << Answer << "\n";
	for ( i = 1 ; i <= N ; ++i )
		out << Len[i] << " " <<Code[i] << "\n";
	in.close();
	out.close();
	return 0;
}