Pagini recente » Cod sursa (job #2395708) | Cod sursa (job #2910539)
#include <bits/stdc++.h>
/// TONI BO$$ was here
/// #MLC
using namespace std;
struct node
{
int val;
int freq;
node *leftChild;
node *rightChild;
bool operator <(const node &oth) const
{
return freq > oth.freq;
}
};
struct Compare
{
bool operator ()(node *x1, node *x2){
return x1->freq > x2->freq;}
};
priority_queue <node *, vector <node *>, Compare> q;
int code[1000001], level[1000001];
void dfs(node *cur, int lev, int nr)
{
if(cur->val)
{
level[cur->val] = lev;
code[cur->val] = nr;
return ;
}
dfs(cur->leftChild, lev + 1, nr << 1);
dfs(cur->rightChild, lev + 1, (nr << 1) + 1);
}
int main()
{
int n, i, f;
freopen("huffman.in","r",stdin);
freopen("huffman.out","w",stdout);
scanf("%d", &n);
long long sum = 0;
for(i = 1; i <= n; i++)
{
scanf("%d", &f);
node *aux = (node *) malloc(sizeof(node));
aux->val = i;
aux->freq = f;
aux->leftChild = nullptr;
aux->rightChild = nullptr;
q.push(aux);
}
while(true)
{
node *x1 = q.top();
q.pop();
if(q.empty())
{
q.push(x1);
break;
}
node *x2 = q.top();
q.pop();
node *x3 = (node *) malloc(sizeof(node));
x3->val = 0;
x3->freq = x1->freq + x2->freq;
sum += x3->freq;
x3->leftChild = x1;
x3->rightChild = x2;
q.push(x3);
}
printf("%lld\n", sum);
node *start = q.top();
dfs(start, 0, 0);
for(i = 1; i <= n; i++)
printf("%d %d\n", level[i], code[i]);
return 0;
}