Pagini recente » Cod sursa (job #629301) | Cod sursa (job #905112) | Cod sursa (job #269209) | Cod sursa (job #1688865) | Cod sursa (job #1866453)
#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 , long long > Sol [MAX] ;
int n ;
void dfs ( int nod , long long base , int cate )
{
if ( nod <= n ) {
Sol [nod] = make_pair (cate, base) ;
return ;
}
dfs ( v [nod].st, base << 1LL , cate + 1 ) ;
dfs ( v [nod].dr, base << 1LL | 1LL , 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) ;
long long len = 0 ;
for ( int i = 1 ; i <= n ; ++ i ) {
len = len + 1LL * 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 ;
}