Pagini recente » Cod sursa (job #1607396) | Cod sursa (job #2793247) | Cod sursa (job #2405566) | Cod sursa (job #2213759) | Cod sursa (job #1121743)
#include <iostream>
#include <fstream>
#include <algorithm>
#include <vector>
#include <queue>
using namespace std;
ifstream fin("huffman.in");
ofstream fout("huffman.out");
const int NMAX = 1e6 + 100;
long long N, lgmin, top, V[NMAX * 2], LG[NMAX], C[NMAX];
typedef pair<long long, int> node;
node fiu[NMAX * 2];
queue <int> q1, q2;
void DFS(int nod, long long lev, long long code)
{
if(nod > N)
{
lgmin += V[nod];
DFS(fiu[nod].first, lev + 1, code << 1);
DFS(fiu[nod].second, lev + 1, (code << 1) + 1);
}
else
{
LG[nod] = lev;
C[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 Number(string s)
{
int n = s.size(); int nr = 0;
for(int i = 0; i < n; i++)
nr = nr * 10 + s[i] - '0';
return nr;
}
int main()
{
fin >> N; fin.get(); string s;
for(int i = 1; i <= N; i++)
{
getline(fin, s);
V[i] = Number(s);
q1.push(i);
}
int min1, min2, T; top = N;
while(q1.size() + q2.size() > 1)
{
min1 = Extract_Min();
min2 = Extract_Min();
V[++top] = V[min1] + V[min2];
fiu[top].first = min1;
fiu[top].second = min2;
q2.push(top);
}
DFS(top, 0, 0);
fout << lgmin << '\n';
for(int i = 1; i <= N; i++)
fout << LG[i] << ' ' <<C[i] << '\n';
return 0;
}