Cod sursa(job #1264033)

Utilizator Andrei1998Andrei Constantinescu Andrei1998 Data 15 noiembrie 2014 14:35:22
Problema Coduri Huffman Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.65 kb
#include <fstream>

#define NMAX 1000005
#define lint long long int
using namespace std;

struct nod{
    int fiu_st,fiu_dr,ans1;
    lint frecv;

    lint ans2;

    nod(int fiu_st=0, int fiu_dr=0,int ans1=0, lint frecv=0,  lint ans2=0): fiu_st(fiu_st), fiu_dr(fiu_dr), ans1(ans1), frecv(frecv), ans2(ans2) {}
}nodes[2*NMAX];

int coada1[NMAX];
int coada2[NMAX];
int st1,dr1,st2,dr2;

void dfs(int nod,lint cod,int depth){
    nodes[nod].ans1=depth;
    nodes[nod].ans2=cod;

    if(nodes[nod].fiu_st)
        dfs(nodes[nod].fiu_st,cod<<1,depth+1);
    if(nodes[nod].fiu_dr)
        dfs(nodes[nod].fiu_dr,(cod<<1)+1,depth+1);
}

inline int ext(){
    if(st1<=dr1 && st2<=dr2){
        if(nodes[coada1[st1]].frecv<nodes[coada2[st2]].frecv)
            return coada1[st1++];
        else
            return coada2[st2++];
    }

    if(st1<=dr1)
        return coada1[st1++];
    return coada2[st2++];
}



int main()
{
    ifstream cin("huffman.in");
    ofstream cout("huffman.out");

    int n=0,i;
    cin>>n;

    int poz=0;
    st1=1,st2=1,dr1=n,dr2=0;

    for(i=1;i<=n;i++){
        cin>>nodes[++poz].frecv;
        coada1[i]=i;
    }

    lint ans=0;
    int n1,n2;

    while(dr1-st1+dr2-st2+1){
        n1=ext();
        n2=ext();

        nodes[++poz].fiu_st=n1;
        nodes[poz].fiu_dr=n2;
        nodes[poz].frecv=nodes[n1].frecv+nodes[n2].frecv;

        ans+=nodes[poz].frecv;

        coada2[++dr2]=poz;
    }

    cout<<ans<<'\n';
    dfs(2*n-1,0,0);

    for(i=1;i<=n;i++)
        cout<<nodes[i].ans1<<' '<<nodes[i].ans2<<'\n';

    cin.close();
    cout.close();
    return 0;
}