Cod sursa(job #1547110)

Utilizator al.mocanuAlexandru Mocanu al.mocanu Data 9 decembrie 2015 00:41:32
Problema Coduri Huffman Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.64 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);
}