Pagini recente » Cod sursa (job #2502413) | Cod sursa (job #1101783) | Cod sursa (job #249419) | Cod sursa (job #2387590) | Cod sursa (job #1217187)
#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;
}