Pagini recente » Cod sursa (job #1220347) | Cod sursa (job #912149) | Cod sursa (job #2569284) | Cod sursa (job #930381) | Cod sursa (job #1222519)
#include <iostream>
#include <iomanip>
#include <fstream>
#include <cstdio>
#include <cmath>
#include <cstring>
#include <vector>
#include <queue>
#include <algorithm>
using namespace std;
#define MAX 1000010
struct Node {
int Freq, L;
long long Code;
struct Node *Left, *Right;
Node() {
L = 0;
Code = 0;
Freq = 0;
Left = Right = 0;
}
};
struct NodeCompare{
bool operator() (const Node *A, const Node*B) {
return A->Freq > B->Freq;
}
};
vector<Node*> A;
queue<Node*> Q1, Q2;
int N;
unsigned long long Sol;
Node * GetMinimum() {
Node *X;
if (Q1.size() == 0) {
X = Q2.front();
Q2.pop();
} else
if (Q2.size() == 0) {
X = Q1.front();
Q1.pop();
} else {
if (Q1.front()->Freq < Q2.front()->Freq) {
X = Q1.front();
Q1.pop();
} else {
X = Q2.front();
Q2.pop();
}
}
return X;
}
void Huffman() {
Node *X, *Y, *Z;
while (Q1.size() + Q2.size() > 1) {
X = GetMinimum();
Y = GetMinimum();
Z = new Node();
Z->Freq = X->Freq + Y->Freq;
Z->Left = X;
Z->Right = Y;
Q1.push(Z);
}
}
void DFS(Node *X, int L, long long Code) {
Node *A = X;
if (A->Left == 0 && A->Right == 0) {
A->L = L;
A->Code = Code;
Sol += (long long)A->L * A->Freq;
} else {
DFS(A->Left, L+1, (Code<<1));
DFS(A->Right, L+1, (Code<<1) + 1);
}
}
int main() {
freopen("huffman.in","r",stdin);
freopen("huffman.out","w",stdout);
scanf("%d", &N);
A.resize(N);
for (int i = 0; i < N; i++) {
A[i] = new Node();
scanf("%d", &A[i]->Freq);
Q2.push(A[i]);
}
Huffman();
DFS(Q1.front(), 0, 0);
printf("%lld\n", Sol);
for (int i = 0; i < A.size(); i++) {
printf("%d %lld\n", A[i]->L, A[i]->Code);
}
return 0;
}