Cod sursa(job #849893)

Utilizator gicu_01porcescu gicu gicu_01 Data 7 ianuarie 2013 19:46:18
Problema Coduri Huffman Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.39 kb
#include <iostream>
#include <string>
#include <fstream>
using namespace std;

ifstream in("huffman.in");
ofstream out("huffman.out");

struct nod{
    int val;
    int left_son;
    int right_son;
    bool x;
}a[2000001];

int n,n2,poz1,poz2;

void init()
{
    in>>n;
    for (int i=1; i<=n; i++)
    {
        in>>a[i].val;
        a[i].left_son=NULL;
        a[i].right_son=NULL;
        a[i].x=true;
    }
    n2=n;
}

int exract_min()
{
    int p,m=1000000;
    for (int i=1; i<=n; i++)
        if (a[i].val<m  && a[i].x) { m=a[i].val; p=i; }
    a[p].x=false;
    return p;
}

void huffman()
{
    int x,y,sum=0;
    for (int i=1; i<=n2-1; i++)
    {
        x=exract_min();
        y=exract_min();
        n++;
        a[n].val=a[x].val+a[y].val;
        sum=sum+a[n].val;
        a[n].left_son=x;
        a[n].right_son=y;
        a[n].x=true;
    }
    out<<sum<<endl;
}

void recur(string s,int p)
{
    if (a[p].left_son==NULL && a[p].right_son==NULL)
    {
        int sum,x,m=s.length();
        sum=0; x=1;
        for (int i=m-1; i>=0; i--)
        {
            if (s[i]=='1') sum=sum+x;
            x=x*2;
        }
        out<<m<<" "<<sum<<endl;
    }
    else
    {
        recur(s+"0",a[p].left_son);
        recur(s+"1",a[p].right_son);
    }
}

int main()
{
    init();
    huffman();
    recur("",n);
    return 0;
}