Pagini recente » Cod sursa (job #2088178) | Cod sursa (job #585725) | Cod sursa (job #1808507) | Cod sursa (job #2743276) | Cod sursa (job #936722)
Cod sursa(job #936722)
#include <stdlib.h>
#include <fstream>
#include <iostream>
#include <string>
#include <queue>
#include <stack>
#include <vector>
#include <string.h>
#include <iomanip>
#include <time.h>
#include <list>
using namespace std;
const string file = "huffman";
const string infile = file + ".in";
const string outfile = file + ".out";
#define MAXN 1000003
#define INF 1LL << 62
struct HNod
{
long long sum;
int l;
int r;
};
long long totalLg;
long long lg[MAXN];
long long codes[MAXN];
HNod nods[MAXN*2];
int N;
int alloc;
queue<int> q1;
queue<int> q2;
int extractMin()
{
long long min1 = q1.empty() == false ? nods[q1.front()].sum : INF;
long long min2 = q2.empty() == false ? nods[q2.front()].sum : INF;
int result;
if(min1 < min2)
{
result = q1.front();
q1.pop();
}
else
{
result = q2.front();
q2.pop();
}
return result;
}
void citire()
{
ifstream fin(infile.c_str());
fin >> N;
for(int i = 0; i < N; i++)
{
int x;
fin >> x;
nods[i].sum = x;
q1.push(i);
}
alloc = N;
fin.close();
}
void DFS(int root, long long code, int level)
{
if(root < N)
{
lg[root] = level;
totalLg += lg[root] * nods[root].sum;
codes[root] = code;
}
else
{
DFS(nods[root].l, code << 1 , level + 1);
DFS(nods[root].r, (code << 1) + 1, level + 1);
}
}
void solve()
{
while(q1.size() + q2.size() != 1)
{
int min1 = extractMin();
int min2 = extractMin();
HNod & nod = nods[alloc];
nod.sum = nods[min1].sum + nods[min2].sum;
nod.l = min1;
nod.r = min2;
q2.push(alloc);
alloc++;
}
DFS(q2.front(), 0, 0);
}
void afisare()
{
ofstream fout(outfile.c_str());
fout << totalLg << "\n";
for(int i = 0; i < N; i++)
{
fout << lg[i] << " " << codes[i] << "\n";
}
fout.close();
}
int main()
{
citire();
solve();
afisare();
}