Pagini recente » Cod sursa (job #704941) | Diferente pentru info-oltenia-2018/individual/clasament/10 intre reviziile 4 si 2 | Cod sursa (job #2272418) | Cod sursa (job #1503500) | Cod sursa (job #1121720)
#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];
priority_queue <node, vector<node>, greater<node> > Q;
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 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);
Q.push(node(V[i], i));
}
int min1, min2, T; top = N;
while(Q.size() > 1)
{
min1 = Q.top().second; Q.pop();
min2 = Q.top().second; Q.pop();
V[++top] = V[min1] + V[min2];
fiu[top].first = min1;
fiu[top].second = min2;
Q.push(node(V[top], top));
}
T = Q.top().second; Q.pop();
DFS(T, 0, 0);
fout << lgmin << '\n';
for(int i = 1; i <= N; i++)
fout << LG[i] << ' ' <<C[i] << '\n';
return 0;
}