Pagini recente » Cod sursa (job #947743) | Cod sursa (job #2938375) | Cod sursa (job #3219945) | Cod sursa (job #3191889) | Cod sursa (job #2077570)
#include <iostream>
#include <fstream>
#include <climits>
using namespace std;
const int nMax = 1000000;
struct Nod
{
long long v;
int f[2];
} nod[2*nMax - 1];
struct Coada
{
int i[nMax];
int s;
int d;
} c[2];
int n;
int lCod[nMax];
long long cod[nMax], lg;
void parcurgereInAdancime(int i, long long codZ, long n)
{
if(nod[i].f[0] != -1)
{
parcurgereInAdancime(nod[i].f[0], codZ*2, n+1);
parcurgereInAdancime(nod[i].f[1], codZ*2+1, n+1);
return;
}
lCod[i]=n;
cod[i]=codZ;
}
const long long infinit = LONG_LONG_MAX;
int celMaiMicNod()
{
long long m = infinit;
int p;
for(int j=0; j<2; j++)
{
if(nod[c[j].i[c[j].s]].v < m && c[j].s<=c[j].d)
{
p=j;
m=nod[c[j].i[c[j].s]].v;
}
}
return c[p].i[c[p].s++];
}
void construiesteCoadaNodurilorInterne()
{
while(c[0].s+c[1].s <= c[0].d+c[1].d)
{
Nod p;
p.f[0] = celMaiMicNod();
p.f[1] = celMaiMicNod();
p.v = nod[p.f[0]].v + nod[p.f[1]].v;
lg += p.v;
nod[n] = p;
c[1].i[++c[1].d] = n++;
}
}
int main()
{
ifstream fin("huffman.in");
fin >> n;
int k = n;
c[0].s = 0;
c[0].d = -1;
for(int i=0; i<n; i++)
{
fin >> nod[i].v;
nod[i].f[0] = -1;
nod[i].f[1] = -1;
c[0].i[++c[0].d] = i;
}
c[1].s = 0;
c[1].d = -1;
construiesteCoadaNodurilorInterne();
parcurgereInAdancime(c[1].i[c[1].s++], 0, 0);
ofstream fout("huffman.out");
fout << lg << '\n';
for(int i=0; i<k; i++)
fout << lCod[i] << ' ' << cod[i] << '\n';
return 0;
}