Pagini recente » Cod sursa (job #2710486) | Cod sursa (job #1207521) | Cod sursa (job #3142194) | Cod sursa (job #225453) | Cod sursa (job #1866452)
#include <fstream>
#include <queue>
using namespace std ;
ifstream cin ("huffman.in");
ofstream cout ("huffman.out") ;
const int MAX = 1e6 + 14 ;
struct Node {
int freq ;
int st ;
int dr ;
int nr ;
} v [4 * MAX] ;
int nNodes = 0 ;
int Cr ( int f , int l, int r, int number ) {
++ nNodes ;
v [nNodes].freq = f ;
v [nNodes].st = l ;
v [nNodes].dr = r ;
v [nNodes].nr = number ;
return nNodes ;
}
class cmp {
public :
bool operator () ( const Node &a, const Node &b ) const {
return a.freq > b.freq ;
}
};
priority_queue < Node, vector <Node>, cmp > H ;
pair < int , int > Sol [MAX] ;
int n ;
void dfs ( int nod , int base , int cate )
{
if ( nod <= n ) {
Sol [nod] = make_pair (cate, base) ;
return ;
}
dfs ( v [nod].st, base << 1 , cate + 1 ) ;
dfs ( v [nod].dr, base << 1 | 1 , cate + 1 ) ;
}
int main()
{
cin >> n ;
for ( int i = 1 ; i <= n ; ++ i ) {
int x ;
cin >> x ;
v [i].freq = x ;
v [i].st = i ;
v [i].dr = i ;
v [i].nr = i ;
H.push (v[i]) ;
}
nNodes = n ;
while ( H.size() > 1 ) {
Node Aux1 = H.top() ; H.pop() ;
Node Aux2 = H.top() ; H.pop() ;
int partial_root = Cr ( Aux1.freq + Aux2.freq, Aux1.nr , Aux2.nr, 0) ;
v [partial_root].nr = partial_root ;
H.push (v[partial_root]) ;
}
dfs (nNodes, 0, 0) ;
int len = 0 ;
for ( int i = 1 ; i <= n ; ++ i ) {
len = len + v [i].freq * Sol [i].first ;
}
cout << len << '\n' ;
for ( int i = 1 ; i <= n ; ++ i ) {
cout << Sol [i].first << ' ' << Sol [i].second << '\n' ;
}
return 0 ;
}