Pagini recente » Cod sursa (job #2864483) | Cod sursa (job #2356378) | Cod sursa (job #2969981) | Cod sursa (job #2131527) | Cod sursa (job #2281400)
#include <cstdio>
#include <queue>
using namespace std;
long long n, nrNod;
bool ok = 1;
long long fiust[2000001], fiudr[2000001], aparitii[2000001];
long long len[1000001], ans[1000001], x1, x2, sum;
void dfs(long long nod, long long val, long long l)
{
if(nod <= n)
{
len[nod] = l;
ans[nod] = val;
return;
}
dfs(fiust[nod], (val << 1), l+1);
dfs(fiudr[nod], (val << 1) + 1, l+1);
}
class Compare
{
public:
bool operator() (long long l, long long r)
{
return aparitii[l] > aparitii[r];
}
};
priority_queue <long long, vector<long long>, Compare> pq;
int main()
{
FILE *in = fopen("huffman.in", "r");
FILE *out = fopen("huffman.out", "w");
fscanf(in, "%d", &n);
nrNod = n;
for(long long i = 1; i <= n; i++)
{
fscanf(in, "%d", &aparitii[i]);
pq.push(i);
}
while(ok)
{
x1 = pq.top();
pq.pop();
if(pq.empty())
ok = 0;
else
{
x2 = pq.top();
pq.pop();
nrNod++;
fiust[nrNod] = x1;
fiudr[nrNod] = x2;
aparitii[nrNod] = aparitii[x1]+aparitii[x2];
pq.push(nrNod);
}
}
dfs(nrNod, 0, 0);
for(long long i = 1; i <= n; i++)
sum += aparitii[i] * len[i];
fprintf(out, "%lld\n", sum);
for(long long i = 1; i <= n; i++)
fprintf(out, "%lld %lld\n", len[i], ans[i]);
return 0;
}