Pagini recente » Cod sursa (job #197227) | Cod sursa (job #260970) | Cod sursa (job #42321) | Cod sursa (job #1225159) | Cod sursa (job #2888437)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("huffman.in");
ofstream fout("huffman.out");
struct nod {
unsigned long frecventa;
nod *dreapta;
nod *stanga;
};
queue<nod *> initial, intern;
vector<vector<unsigned long>> rezultat(1000000);
unsigned long nrElemente;
nod *furnizare() {
nod *val;
if (initial.empty()) {
val = intern.front();
intern.pop();
return val;
} else if (intern.empty()) {
val = initial.front();
initial.pop();
return val;
} else if (initial.front()->frecventa < intern.front()->frecventa) {
val = initial.front();
initial.pop();
return val;
} else {
val = intern.front();
intern.pop();
return val;
}
}
void configurare(nod *&curent, unsigned long reprezentare, unsigned long nivel) {
if (curent->dreapta != NULL) {
configurare(curent->stanga, reprezentare << 1, nivel + 1);
}
if (curent->stanga != NULL) {
configurare(curent->dreapta, (reprezentare << 1) | 1, nivel + 1);
}
if (curent->stanga == NULL)
rezultat[nivel].push_back(reprezentare);
}
void sterge(nod *n) {
if (n) {
sterge(n->dreapta);
sterge(n->stanga);
delete n;
}
}
int main() {
unsigned long index, valoare, suma = 0, i;
fin >> nrElemente;
for (index = 0; index < nrElemente; index += 1) {
fin >> valoare;
nod *nod1 = new nod;
nod1->stanga = NULL;
nod1->dreapta = NULL;
nod1->frecventa = valoare;
initial.push(nod1);
}
while (initial.size() > 1 or intern.size() > 1) {
nrElemente += 1;
nod *nodParinte = new nod;
nodParinte->dreapta = furnizare();
nodParinte->stanga = furnizare();
nodParinte->frecventa = nodParinte->dreapta->frecventa + nodParinte->stanga->frecventa;
intern.push(nodParinte);
suma += nodParinte->frecventa;
}
fout << suma << "\n";
configurare(intern.front(), 0, 0);
sterge(intern.front());
for (index = rezultat.size() - 1; index >= 1; index -= 1) {
for (i = 0; i < rezultat[index].size(); i += 1) {
fout << index << " " << rezultat[index][i] << "\n";
}
rezultat[index].clear();
}
return 0;
}