Pagini recente » Cod sursa (job #1023712) | Cod sursa (job #2151871) | Cod sursa (job #2558943) | Cod sursa (job #1844917) | Cod sursa (job #1523697)
#include <bits/stdc++.h>
using namespace std;
struct node{
node *ls = NULL;
node *rs = NULL;
long long inf = 0;
int poz = 0;
};
long long n, v;
priority_queue< pair<long long, node *> > q;
pair<long long, long long> b[1000005];
long long fg[1000005];
void dfs(node *start, int p, int niv) {
if(start->poz) {
b[start->poz].first = niv;
b[start->poz].second = p;
fg[start->poz] = start->inf;
return ;
}
dfs(start->ls, p, niv + 1);
dfs(start->rs, p | (1 << niv), niv + 1);
}
int main()
{
FILE *f = fopen("huffman.in", "r");
FILE *g = fopen("huffman.out", "w");
fscanf(f, "%lld", &n);
for(int i = 1; i <= n; i ++) {
node *p = new node;
p->poz = i;
fscanf(f, "%lld", &p->inf);
q.push(make_pair(-p->inf, p));
}
while(q.size() > 0) {
node *fst = q.top().second;
q.pop();
node *snd = q.top().second;
q.pop();
node *aux = new node;
aux->rs = fst;
aux->ls = snd;
aux->inf = fst->inf + snd->inf;
q.push(make_pair(-aux->inf, aux));
}
node *start = q.top().second;
dfs(start, 0, 0);
long long s = 0;
for(int i = 1; i <= n; i ++) {
s += b[i].first * fg[i];
}
fprintf(g, "%lld\n", s);
for(int i = 1; i <= n; i ++) {
fprintf(g, "%lld %lld\n", b[i].first, b[i].second);
}
return 0;
}