Pagini recente » Cod sursa (job #1381819) | Cod sursa (job #165596) | Cod sursa (job #1701101) | Cod sursa (job #865770) | Cod sursa (job #2205730)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("huffman.in");
ofstream fout("huffman.out");
struct Nod
{
int info;
int fr;
Nod *left, *right;
Nod(int info, int fr, Nod *left, Nod *right) : info(info), fr(fr), left(left), right(right) {};
};
class cmp_node
{
public:
bool operator() (Nod* a, Nod* b)
{
return a->fr > b->fr;
}
};
int n, i, fr, lg_txt;
priority_queue<Nod*, vector<Nod*>, cmp_node> q;
vector<pair<int, int>> coded;
Nod* Huffman()
{
for(i = 1; i < n; i++)
{
Nod *x = q.top(); q.pop();
Nod *y = q.top(); q.pop();
Nod *z = new Nod(0, x->fr + y->fr, x, y);
q.push(z);
}
return q.top();
}
void get_solution(Nod* node, int code, int depth, int direction)
{
if(node == NULL) return;
if(node->left == NULL && node->right == NULL) coded[node->info] = {depth, code};
else lg_txt += node->fr;
get_solution(node->left, code * 2, depth + 1, 0);
get_solution(node->right, code * 2 + 1, depth + 1, 1);
}
int main()
{
fin >> n;
coded.resize(n + 1);
for(i = 1; i <= n; i++)
{
fin >> fr;
Nod *x = new Nod(i, fr, NULL, NULL);
q.push(x);
}
Nod *tree = Huffman();
ostringstream output;
get_solution(tree, 0, 0, 0);
coded.erase(coded.begin());
fout<<lg_txt<<"\n";
for(const auto& it : coded)
fout<<it.first<<" "<<it.second<<"\n";
return 0;
}