Cod sursa(job #1217187)

Utilizator rogoz.bogdanRogoz Bogdan rogoz.bogdan Data 6 august 2014 20:29:46
Problema Coduri Huffman Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.6 kb
#include <fstream>
#include <vector>
#include <queue>
#include <algorithm>
#define MX 1000001
using namespace std;

ifstream fin("huffman.in");
ofstream fout("huffman.out");
int n, nr;

struct Nod
{
    long long info;
    Nod *st, *dr;
};

struct cmp
{
    bool operator() (Nod *a, Nod *b)
    {
        return a->info > b->info;
    }
};
priority_queue<Nod*, vector<Nod*>, cmp> v;

void citire()
{
    int i,x;
    Nod *p;
    fin>>n;
    for(i=1; i<=n; i++)
    {
        fin>>x;
        p = new Nod;
        p->info = x;
        p->st = NULL;
        p->dr = NULL;
        v.push(p);
    }
}

void arbore()
{
    Nod *p, *c1, *c2;
    while(v.size() > 1)
    {
        c1 = v.top(); v.pop();
        c2 = v.top(); v.pop();
        p = new Nod;
        p->info = c1->info + c2->info;
        p->st = c1;
        p->dr = c2;
        v.push(p);
    }
}

long long suma(Nod *p)
{
    if(p->dr==NULL || p->st==NULL) return 0;
    else
    {
        return (p->info + suma(p->st) + suma(p->dr));
    }
}

void SDR(Nod *p)
{
    if(p)
    {
        SDR(p->st);
        SDR(p->dr);
        delete p;
    }
}

void trm(Nod *p, bool sens, int h)
{
    if(p)
    {
        nr = (nr<<1) + sens;
        trm(p->st, 0, h+1);
        trm(p->dr, 1, h+1);
        if(p->st==NULL || p->dr==NULL) fout<<h<<' '<<nr<<'\n';
        nr = (nr>>1);
    }
}

int main()
{
    citire();
    arbore();
    fout<<suma(v.top())<<'\n';

    trm(v.top()->st, 0, 1);
    trm(v.top()->dr, 1, 1);

    SDR(v.top());

    fin.close(); fout.close();
    return 0;
}