Pagini recente » Cod sursa (job #350593) | Cod sursa (job #2391406) | Cod sursa (job #2401903) | Cod sursa (job #352101) | Cod sursa (job #2888404)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("huffman.in");
ofstream fout("huffman.out");
struct nod {
long long frecventa;
nod *dreapta;
nod *stanga;
};
queue<nod *> initial, intern;
vector<vector<long long>> rezultat(1000000);
long 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;
}
}
///fac recursiv cu &nivel si dupa fac nivel + 1, trebuie sa vad la reprezentarea binara cum fac
void configurare(nod *&curent, int reprezentare, int 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);
}
int main() {
int index, valoare, suma = 0, nivel, reprezentare = 0;
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);
}
nivel = 0;
while (initial.size() > 1 or intern.size() > 1) {
nrElemente += 1;
nod *nodDreapta, *nodStanga;
nodDreapta = furnizare();
nodStanga = furnizare();
nod *nodParinte = new nod;
nodParinte->frecventa = nodDreapta->frecventa + nodStanga->frecventa;
nodParinte->dreapta = nodDreapta;
nodParinte->stanga = nodStanga;
intern.push(nodParinte);
suma += nodParinte->frecventa;
}
fout << suma << "\n";
configurare(intern.front(), reprezentare, nivel);
for (index = rezultat.size() - 1; index >= 1; index -= 1) {
for (int i = 0; i < rezultat[index].size(); i += 1) {
fout << index << " " << rezultat[index][i] << "\n";
}
}
return 0;
}