Pagini recente » Monitorul de evaluare | Diferente pentru home intre reviziile 279 si 902 | Cod sursa (job #2561421) | Cod sursa (job #1307979) | Cod sursa (job #1546579)
#include <stdio.h>
#include <stdlib.h>
#include <queue>
#include <vector>
#define MAX 200005
using namespace std;
typedef struct TNode {
struct TNode** child;
int val;
} Node;
int n, x, nr, minim;
char word[20];
Node *l[MAX], *min1, *min2;
queue<Node*> q1, q2;
void print(char word[], int n){
printf("%d ", n);
int pow = 1, val = 0;
for(int i = n - 1; i >= 0; i--){
val += pow * word[i];
pow *= 2;
}
printf("%d\n", val);
}
void dfs(Node* x, char word[], int n){
if(!x->child[0] && !x->child[1]){
print(word, n);
return;
}
if(x->child[0]){
word[n] = 0;
dfs(x->child[0], word, n + 1);
}
if(x->child[1]){
word[n] = 1;
dfs(x->child[1], word, n + 1);
}
}
int main(){
freopen("huffman.in", "r", stdin);
freopen("huffman.out", "w", stdout);
scanf("%d", &n);
for(int i = 0; i < n; i++){
scanf("%d", &x);
l[i] = (Node*)malloc(sizeof(Node));
l[i]->child = (Node**)malloc(2 * sizeof(Node*));
l[i]->child[0] = NULL;
l[i]->child[1] = NULL;
l[i]->val = x;
q1.push(l[i]);
}
nr = n;
while(!q1.empty() || q2.size() > 1){
l[nr] = (Node*)malloc(sizeof(Node));
l[nr]->child = (Node**)malloc(2 * sizeof(Node*));
if(!q1.empty()){
minim = q1.front()->val;
if(!q2.empty() && q2.front()->val < minim){
min1 = q2.front();
q2.pop();
}
else{
min1 = q1.front();
q1.pop();
}
}
else{
min1 = q2.front();
q2.pop();
min2 = q2.front();
q2.pop();
}
if(!q1.empty()){
minim = q1.front()->val;
if(!q2.empty() && q2.front()->val < minim){
min2 = q2.front();
q2.pop();
}
else{
min2 = q1.front();
q1.pop();
}
}
l[nr]->child[0] = min1;
l[nr]->child[1] = min2;
l[nr]->val = min1->val + min2->val;
q2.push(l[nr++]);
}
printf("%d\n", l[2 * n - 2]->val);
dfs(l[2 * n - 2], word, 0);
return 0;
}