Pagini recente » Cod sursa (job #10493) | Cod sursa (job #949583) | Cod sursa (job #1478294) | Cod sursa (job #1560002) | Cod sursa (job #977479)
Cod sursa(job #977479)
#include <iostream>
#include <fstream>
#include <queue>
using namespace std;
#define f first
#define s second
#define cod1 (code << 1)
#define cod2 cod1 + 1
ifstream fin("huffman.in");
ofstream fout("huffman.out");
const int N = 1000010;
int lg[N];
long long n, lgmin, vf, v[N*2], cod[N];
vector < pair <int, int> > fiu(2*N);
queue <int> q1, q2;
void dfs(int nod, int height, long long code)
{
if(nod > n)
{
lgmin += v[nod];
dfs(fiu[nod].f, height + 1, cod1);
dfs(fiu[nod].s, height + 1, cod2);
}
else
{
lg[nod] = height;
cod[nod] = code;
}
}
int Extract_Min()
{
int mini;
if(q1.empty())
{
mini = q2.front(); q2.pop();
return mini;
}
if(q2.empty())
{
mini = q1.front(); q1.pop();
return mini;
}
if(v[q1.front()] < v[q2.front()])
{
mini = q1.front(); q1.pop();
return mini;
}
mini = q2.front(); q2.pop();
return mini;
}
int main()
{
fin>>n; char s[20]; fin.get();
for(int i=1; i<=n; i++)
{
q1.push(i); fin.getline(s, 20); long long nr = 0;
for(int j=0; s[j]; j++)
nr = nr * 10 + s[j] - '0';
v[i] = nr;
}
int min1, min2; vf = n;
while(q1.size() + q2.size() > 1)
{
min1 = Extract_Min();
min2 = Extract_Min();
v[++vf] = v[min1] + v[min2];
fiu[vf].f = min1;
fiu[vf].s = min2;
q2.push(vf);
}
dfs(vf, 0, 0);
fout<<lgmin<<'\n';
for(int i=1; i<=n; i++)
fout<<lg[i]<<' '<<cod[i]<<'\n';
return 0;
}