Pagini recente » Cod sursa (job #1096483) | Cod sursa (job #2249751) | Cod sursa (job #2956964) | Cod sursa (job #972336) | Cod sursa (job #1100055)
#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 < int > Q_first , Q_second;
int A , B , val[2*NMAX];
int N , K,Len[NMAX];
long long Code[NMAX] , Answer;
void Extract ( int &V)
{
if ( Q_second.empty() and Q_first.empty() )
return ;
if ( !Q_second.empty())
{
if ( !Q_first.empty() )
{
if ( val[Q_first.front()]< val[Q_second.front()] )
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 >> val[i] , Q_first.push( i);
K = N + 1;
for ( ; !Q_first.empty() or !Q_second.empty() ; )
{
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];
if ( A != 0 and B !=0 )
Q_second.push( K );
else --K,Answer -= val[A];
A = B = 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;
}