Pagini recente » Cod sursa (job #1760464) | Cod sursa (job #108549) | Cod sursa (job #1647549) | Cod sursa (job #848844) | Cod sursa (job #1100079)
#include <fstream>
#include <algorithm>
#include <vector>
#include <queue>
#define INF 1LL*(1<<30)
#define NMAX 1000005
#define SZ 1500000
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;
char input[SZ],*ina=input;
inline int atoi()
{
int nr=0;
for(;!(*ina>='0' && *ina<='9');++ina);
for(;*ina>='0' && *ina<='9';++ina)
nr=nr*10+(*ina-'0');
return nr;
}
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.read(input , SZ);
N = atoi();
for ( i = 1 ; i <= N ; ++i )
val[i] = atoi() , 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;
}