Pagini recente » Cod sursa (job #1291486) | Cod sursa (job #1765413) | Cod sursa (job #1372913) | Cod sursa (job #717518) | Cod sursa (job #2197701)
#include <fstream>
#include <iostream>
#include <climits>
#include <vector>
using namespace std;
ifstream in("huffman.in");
ofstream out("huffman.out");
int const nmax = 1e6;
int q[2][1 + nmax], le[2], ri[2];
int sol[2][1 + nmax];
struct Node {
int freq;
int sons[2];
};
Node v[1 + 2 * nmax];
int suma;
void dfs(int nod, int h = 0, int code = 0) {
if(v[nod].sons[0] + v[nod].sons[1] > 0) {
dfs(v[nod].sons[0], h + 1, code * 2);
dfs(v[nod].sons[1], h + 1, code * 2 + 1);
} else {
suma += h * v[nod].freq;
sol[0][nod] = h;
sol[1][nod] = code;
}
}
int main() {
int n;
in >> n;
for(int i = 1; i <= n; ++ i) {
in >> v[i].freq;
q[0][i] = i;
}
le[0] = le[1] = 1;
ri[0] = n;
ri[1] = 0;
int nnod = n;
while(le[0] <= ri[0] || le[1] < ri[1]) {
nnod ++;
for(int i = 0; i < 2; i++) {
int minf = INT_MAX, unde = 0;
for(int j = 0; j < 2; j++) {
if(le[j] <= ri[j] && v[q[j][le[j]]].freq < minf) {
minf = v[q[j][le[j]]].freq;
unde = j;
}
}
v[nnod].freq += minf;
v[nnod].sons[i] = q[unde][le[unde] ++];
}
q[1][++ ri[1]] = nnod;
}
dfs(nnod);
out << suma << '\n';
for(int i = 1; i <= n; ++ i) {
out << sol[0][i] << " " << sol[1][i] << '\n';
}
return 0;
}