Cod sursa(job #1468478)

Utilizator al.mocanuAlexandru Mocanu al.mocanu Data 6 august 2015 10:37:48
Problema Coduri Huffman Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.47 kb
#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);
}