Cod sursa(job #1547109)

Utilizator al.mocanuAlexandru Mocanu al.mocanu Data 9 decembrie 2015 00:35:25
Problema Coduri Huffman Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 2.26 kb
#include <stdio.h>
#include <stdlib.h>
#include <queue>
#include <vector>
#define MAX 200005
using namespace std;
 
typedef struct TNode {
    struct TNode** child;
    long long val;
} Node;
 
int n, nr;
long long minim, rez, x;
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("%lld", &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;
        rez += l[nr]->val;
        q2.push(l[nr++]);
    }
 
    printf("%lld\n", rez);
    dfs(l[2 * n - 2], word, 0);
    return 0;
}