Cod sursa(job #534109)

Utilizator dicu_dariaDaria Dicu dicu_daria Data 15 februarie 2011 10:48:01
Problema Coduri Huffman Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.02 kb
#include <fstream>
#include <queue>
#define MAXN 1000003
using namespace std;
queue< pair<long long,int> >q1,q2;
pair<long long, int>x,y,s;
int n,k,i,l[MAXN];
long long b[MAXN],total;
typedef struct{
int fd,fs;
long long v;
}elem;
elem nod[2*MAXN];
void build(){
k=n;
while(q1.size()+q2.size()>=2)
{
    ++k;
    if(!q1.empty() and !q2.empty())
    {
    x=q1.front();
    y=q2.front();
    if(y.first<x.first) s=y; else s=x;
    nod[k].v+=s.first;
    nod[k].fs=s.second;
    if(s==x) q1.pop(); else q2.pop();

    if(!q1.empty() and !q2.empty()){
    x=q1.front();
    y=q2.front();
    if(y.first<x.first) s=y; else s=x;
    nod[k].v+=s.first;
    nod[k].fd=s.second;
    if(s==x) q1.pop(); else q2.pop();
    }
    else if(!q1.empty())
    {
        x=q1.front();
        nod[k].v+=x.first;
        nod[k].fd=x.second; q1.pop();

    } else
    if(!q2.empty())
    {
        x=q2.front();
        nod[k].v+=x.first;
        nod[k].fd=x.second; q2.pop();

    }
    }



    else
    if(!q1.empty())
    {
        x=q1.front();
        nod[k].v+=x.first;
        nod[k].fs=x.second; q1.pop();
        x=q1.front();
        nod[k].v+=x.first;
        nod[k].fd=x.second; q1.pop();

    } else
    if(!q2.empty())
    {
        x=q2.front();
        nod[k].v+=x.first;
        nod[k].fs=x.second; q2.pop();
        x=q2.front();
        nod[k].v+=x.first;
        nod[k].fd=x.second; q2.pop();

    }
    total+=nod[k].v;
    q2.push(make_pair(nod[k].v,k));
}

}
void walk(int poz,long long cod,int nivel){
    if(nod[poz].fs){
    walk(nod[poz].fs,cod*2,nivel+1);
    walk(nod[poz].fd,cod*2+1,nivel+1);
    } else
    {
    b[poz]=cod; l[poz]=nivel;
    }

}
int main()
{
    ifstream fi("huffman.in");
    ofstream fo("huffman.out");
    fi>>n;
    for(i=1;i<=n;i++)
    {
        fi>>nod[i].v;
        q1.push(make_pair(nod[i].v,i));
    }
    build();
    walk(k,0,0);
    fo<<total<<"\n";
    for(i=1;i<=n;i++)
    fo<<l[i]<<" "<<b[i]<<"\n";
    return 0;
}