Pagini recente » Cod sursa (job #359957) | Cod sursa (job #2754095) | Cod sursa (job #2409949) | Cod sursa (job #1684090) | Cod sursa (job #1547110)
#include <stdio.h>
#include <queue>
#define MAX 1000005
using namespace std;
typedef struct{
long long v;
int l, r;
} Node;
queue<int> qni, qne;
Node arb[2 * MAX];
int n, i, x, poz, p, lvl[MAX];
long long lg, bi[MAX];
Node createnode(int a, int b, int poz);
void huffman();
void dfs(int node, long long code, int level);
int main(){
freopen("huffman.in", "r", stdin);
freopen("huffman.out", "w", stdout);
scanf("%d", &n);
for(i = 0; i < n; i++){
scanf("%d", &x);
arb[i].v = x;
arb[i].l = arb[i].r = -1;
qne.push(i);
}
poz = n;
huffman();
printf("%lld\n", lg);
for(i = 0; i < n; i++)
printf("%d %lld\n", lvl[i], bi[i]);
return 0;
}
Node createnode(int a, int b, int poz){
Node x;
x.v = arb[a].v + arb[b].v;
x.l = a;
x.r = b;
return x;
}
void huffman(){
while(1){
int a, b;
if(qni.empty()){
a = qne.front(); qne.pop();
b = qne.front(); qne.pop();
arb[poz] = createnode(a, b, poz); qni.push(poz);
lg += arb[poz++].v;
}
else{
if(qne.empty()){
a = qni.front(); qni.pop();
if(qni.empty())
break;
else{
b = qni.front(); qni.pop();
arb[poz] = createnode(a, b, poz); qni.push(poz);
lg += arb[poz++].v;
}
}
else{
if(arb[qne.front()].v < arb[qni.front()].v){
a = qne.front(); qne.pop();
}
else{
a = qni.front(); qni.pop();
}
if(qne.empty()){
b = qni.front(); qni.pop();
}
else if(qni.empty()){
b = qne.front(); qne.pop();
}
else
if(arb[qne.front()].v < arb[qni.front()].v){
b = qne.front(); qne.pop();
}
else{
b = qni.front(); qni.pop();
}
arb[poz] = createnode(a, b, poz); qni.push(poz);
lg += arb[poz++].v;
}
}
}
dfs(poz - 1, 0, 0);
}
void dfs(int node, long long code, int level){
if(arb[node].l == -1){
lvl[node] = level;
bi[node] = code;
return;
}
dfs(arb[node].l, 2 * code, level + 1);
dfs(arb[node].r, 2 * code + 1, level + 1);
}