Pagini recente » Istoria paginii utilizator/lordseban | Cod sursa (job #445828) | Cod sursa (job #2015759) | Cod sursa (job #2394331) | Cod sursa (job #755557)
Cod sursa(job #755557)
#include <fstream>
#include <stack>
#include <queue>
#include <string.h>
using namespace std;
long N;
struct TNod;
typedef TNod *PNod;
struct TNod
{
PNod Left,Right;
long Index;
long Val;
};
long T;
long long B[1000005];
long LenB[1000005];
void CreazaSolutie(PNod R,long CodLen,long CodRep)
{
if (R->Index >= 0)
{
LenB[R->Index] = CodLen;
B[R->Index] = CodRep;
T += R->Val * CodLen;
return;
}
CreazaSolutie(R->Left,CodLen + 1,CodRep << 1);
CreazaSolutie(R->Right,CodLen + 1,(CodRep << 1) | 1);
}
void AlegeNodMin(queue<PNod> &QFrunza,queue<PNod> &QNod,PNod &n1,PNod &n2)
{
if (QFrunza.size() == 0)
{
n1 = QNod.front();
QNod.pop();
n2 = QNod.front();
QNod.pop();
return;
}
if (QNod.size() == 0)
{
n1 = QFrunza.front();
QFrunza.pop();
n2 = QFrunza.front();
QFrunza.pop();
return;
}
if (QFrunza.front()->Val < QNod.front()->Val)
{
n1 = QFrunza.front();
QFrunza.pop();
if (QFrunza.size() == 0)
{
n2 = QNod.front();
QNod.pop();
return;
}
if (QFrunza.front()->Val < QNod.front()->Val)
{
n2 = QFrunza.front();
QFrunza.pop();
}
else
{
n2 = QNod.front();
QNod.pop();
}
}
else
{
n1 = QNod.front();
QNod.pop();
if (QFrunza.front()->Val < QNod.front()->Val)
{
n2 = QFrunza.front();
QFrunza.pop();
}
else
{
n2 = QNod.front();
QNod.pop();
}
}
}
int main(void)
{
queue<PNod> QFrunza,QNod;
long i;
fstream fin("huffman.in",ios::in);
fstream fout("huffman.out",ios::out);
fin >> N;
for (i = 0;i < N;i += 1)
{
PNod n = new TNod();
n->Left = 0;
n->Right = 0;
n->Index = i;
fin >> n->Val;
QFrunza.push(n);
}
while ((QFrunza.size() != 0) || (QNod.size() != 1))
{
PNod b1,b2,bn;
AlegeNodMin(QFrunza,QNod,b1,b2);
bn = new TNod();
bn->Left = b1;
bn->Right = b2;
bn->Index = -1;
bn->Val = b1->Val + b2->Val;
QNod.push(bn);
}
CreazaSolutie(QNod.front(),0,0);
fout << T << "\n";
for (i = 0;i < N;i += 1)
{
fout << LenB[i] << " " << B[i] << "\n";
}
fin.close();
fout.close();
return 0;
}