Cod sursa(job #1146235)

Utilizator oprea1si2si3Oprea Sebastian oprea1si2si3 Data 18 martie 2014 20:21:12
Problema Coduri Huffman Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.62 kb
#include<fstream>
#include<iostream>
#define Maxn 1000100
#define INF 1LL*Maxn*Maxn
using namespace std;

struct nod {long long valoare;int fii[2];}Nod[2*Maxn];

int N,l[2],r[2],NrNod;
int q[2][Maxn], lg[Maxn];
long long b[Maxn], m, sol;

void citire() {

    ifstream in("huffman.in");
    int i;
    in>>N;
    for(i=1;i<=N;i++) {
        in>>Nod[i].valoare;
        q[0][i]=i;
    }
    in.close();

}

void dfs(int poz, long long cod, int nivel)
{
    if(Nod[poz].fii[0]) {
        dfs(Nod[poz].fii[0], cod*2, nivel+1);
        dfs(Nod[poz].fii[1], cod*2+1, nivel+1);
        return;
    }
    lg[poz]=nivel;
    b[poz]=cod;
}
void solve() {

    int fiu1,fiu2;
    NrNod=N;
    l[0]=1;
    l[1]=1;
    r[0]=N;
    Nod[0].valoare=INF;

    while(l[0]<=r[0]||l[1]<r[1]) {

        if(Nod[q[0][l[0]]].valoare<Nod[q[1][l[1]]].valoare)
            fiu1=q[0][l[0]++];
        else
            fiu1=q[1][l[1]++];
        if(Nod[q[0][l[0]]].valoare<Nod[q[1][l[1]]].valoare)
            fiu2=q[0][l[0]++];
        else
            fiu2=q[1][l[1]++];
        cout<<fiu1<<' '<<fiu2<<'\n';
        NrNod++;
        Nod[NrNod].fii[0]=fiu1;
        Nod[NrNod].fii[1]=fiu2;
        Nod[NrNod].valoare=Nod[fiu1].valoare+Nod[fiu2].valoare;
        sol+=Nod[NrNod].valoare;
        r[1]++;
        q[1][r[1]]=NrNod;
    }
    dfs(NrNod,0,0);

}

void afisare() {

    ofstream out("huffman.out");
    int i;
    out<<sol<<'\n';
    for(i=1;i<=N;i++)
        out<<lg[i]<<' '<<b[i]<<'\n';
    out.close();

}

int main() {

    citire();
    solve();
    afisare();
    return 0;

}