Pagini recente » Cod sursa (job #1091298) | Cod sursa (job #3122991) | Cod sursa (job #661834) | Cod sursa (job #1665865) | Cod sursa (job #1995513)
#include <cstdio>
#include <queue>
using namespace std;
const int N = 1000;
struct Nod{
int val, frec;
};
struct Tata{
int tata;
int bit;
};
Nod noduri[N];
Tata tati[N];
int nrDeScazut;
int n;
int nn;
queue<Nod> q1;
queue<Nod> q2;
void citire()
{
scanf("%d", &n);
nn = n;
Nod tmpx;
int tmp;
for(int i = 0; i < n; i++)
{
scanf("%d", &tmp);
tmpx.frec = tmp;
tmpx.val = i;
q1.push(tmpx);
nrDeScazut += tmp;
}
}
Nod gasireMinim()
{
Nod tmp1, tmp2;
if(q1.empty() == true)
{
tmp1 = q2.front();
q2.pop();
return tmp1;
}
if(q2.empty() == true)
{
tmp1 = q1.front();
q1.pop();
return tmp1;
}
tmp1 = q1.front();
tmp2 = q2.front();
if(tmp1.frec <= tmp2.frec)
{
q1.pop();
return tmp1;
}
else
{
q2.pop();
return tmp2;
}
}
void solve()
{
Nod nr1, nr2;
int solutie = 0;
while(q1.empty() == false || q2.empty() == false)
{
nr1 = gasireMinim();
nr2 = gasireMinim();
solutie += (nr1.frec + nr2.frec);
tati[nr1.val].tata = tati[nr2.val].tata = n;
tati[nr1.val].bit = 0;
tati[nr2.val].bit = 1;
Nod nox;
nox.val = n;
nox.frec = nr1.frec + nr2.frec;
q2.push(nox);
n++;
}
printf("%d", solutie - nrDeScazut);
for(int i = 0; i < nn; i++)
{
int x = i;
int val = 0;
int put = 1;
int l = 0;
while(x != n - 1)
{
if(tati[x].bit == 1)
{
val += put;
}
put <<= 1;
l++;
x = tati[x].tata;
}
printf("%d %d\n", l - 1, val);
}
}
int main()
{
freopen("huffman.in", "r", stdin);
freopen("huffman.out", "w", stdout);
citire();
solve();
return 0;
}