Pagini recente » Cod sursa (job #454070) | Cod sursa (job #1193536) | Cod sursa (job #448186) | Cod sursa (job #20629) | Cod sursa (job #769460)
Cod sursa(job #769460)
#include <stdio.h>
#include <queue>
#include <limits>
#include <fstream>
#define int64 long long int
#define arb node*
using namespace std;
typedef struct node {
int64 frecv;
arb left;
arb right;
int poz;
} node;
queue<arb> A;
queue<arb> Init;
int n;
int64 S;
int V_h[1000001];
int64 V_val[1000001];
void read_() {
char buff;
ifstream in("huffman.in");
in >> n;
for (int i = 0; i < n; i++) {
arb El = new node();
in >> El->frecv;
El->poz = i;
Init.push(El);
}
in.close();
}
void solve_() {
arb El = new node();
El->frecv = numeric_limits<int64>::max();
Init.push(El);
node *El1, *El2, *Fin;
for (int i = 1; i < n; i++) {
if (A.size() == 0 || (A.front())->frecv > (Init.front())->frecv) {
El1 = Init.front();
Init.pop();
}
else {
El1 = A.front();
A.pop();
}
if (A.size() == 0 || (A.front())->frecv > (Init.front())->frecv) {
El2 = Init.front();
Init.pop();
}
else {
El2 = A.front();
A.pop();
}
Fin = new node();
Fin->frecv = El1->frecv + El2->frecv;
Fin->left = El1;
Fin->right = El2;
A.push(Fin);
S += Fin->frecv;
//printf("%lld %lld -> %lld\n", El1->frecv, El2->frecv, Fin->frecv);
}
}
void dfs_(arb H, int h, int64 val) {
if (H->left != NULL) {
dfs_(H->left, h + 1, val << 1);
}
if (H->right != NULL) {
dfs_(H->right, h + 1, (val << 1) + 1);
}
if (H->left == NULL && H->right == NULL) {
V_h[H->poz] = h;
V_val[H->poz] = val;
}
}
void print_() {
ofstream out("huffman.out");
out << S << endl;
for (int i = 0; i < n; i++) {
out << V_h[i] << " " << V_val[i] << endl;
}
out.close();
}
int main() {
//freopen("huffman.in", "r", stdin);
//freopen("huffman.out", "w", stdout);
int start,end;
int dif;
start = clock();
read_();
end = clock();
dif = end - start;
//printf ("\nIt took me %d -> read.\n", dif );
start = clock();
solve_();
end = clock();
dif = end - start;
//printf ("\nIt took me %d -> solve.\n", dif );
start = clock();
dfs_(A.front(), 0, 0);
end = clock();
dif = end - start;
// printf ("\nIt took me %d -> dfs.\n", dif );
start = clock();
print_();
end = clock();
dif = end - start;
//printf ("\nIt took me %d -> print.\n", dif );
return 0;
}