Cod sursa(job #1100035)

Utilizator superman_01Avramescu Cristian superman_01 Data 6 februarie 2014 15:50:22
Problema Coduri Huffman Scor 80
Compilator cpp Status done
Runda Arhiva educationala Marime 1.77 kb
#include <fstream>
#include <algorithm>
#include <vector>
#include <queue>

#define NMAX 1000005

using namespace std;

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

struct Huffman {
	int son[2];
}Nodes[2*NMAX];

queue < pair < long long, int > > Q_first , Q_second;
pair < long long , int>	A , B;
int N , K,Len[NMAX];
long long Code[NMAX] , Answer;
void Extract ( pair <long long , int > &V)
{
	if ( Q_second.empty() and Q_first.empty() )
		return ; 
	  if ( !Q_second.empty())
	  {
		  if ( !Q_first.empty() )
		  {
		  if ( Q_first.front().first < Q_second.front().first ) 
			   V = Q_first.front() , Q_first.pop();
		  else
		       V = Q_second.front() , Q_second.pop();
		  }
		  else V = Q_second.front() , Q_second.pop();
	  }
	  else V = Q_first.front() , Q_first.pop();
}
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 >> x , Q_first.push(make_pair ( x, i));
	K = N + 1;
	for ( ; !Q_first.empty() or !Q_second.empty() ; )
	{
		Extract ( A );
		Extract ( B );
		Answer += A.first + B.first;
		Nodes[++K].son[0] = A.second;
		Nodes[K].son[1] = B.second;
		if ( A.first != 0 and B.second !=0 )
		Q_second.push( make_pair(A.first + B.first , K) );
		else --K,Answer -= A.first;
		A.first = A.second = B.first = B.second = 0;
	}
	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;
}