Pagini recente » Cod sursa (job #2703407) | Cod sursa (job #783152) | Cod sursa (job #3239416) | Cod sursa (job #579521) | Cod sursa (job #1767452)
#include <fstream>
using namespace std;
ifstream f("huffman.in");
ofstream g("huffman.out");
const int Nmax = 1000005;
int q1[Nmax], q2[Nmax], l1, r1, l2, r2, n, nr, level[Nmax];
long long sol, Config[Nmax];
struct graf
{
long long frecv;
int fiu1, fiu2;
} G[2*Nmax];
void Read()
{
f>>n;
for(int i = 1; i <= n; i++)
{
f>>G[i].frecv;
q1[i] = i;;
}
}
void Select(int &a)
{
if(G[q1[l1]].frecv < G[q2[l2]].frecv) a = q1[l1++];
else a = q2[l2++];
}
void Solve()
{
G[0].frecv = 100000000000000;
l1 = l2 = 1;
r2 = 0;
r1 = n;
nr = n;
while(l1 <= r1 || l2 < r2)
{
int a, b;
Select(a);
Select(b);
G[++nr].fiu1 = a;
G[nr].fiu2 = b;
G[nr].frecv = G[a].frecv + G[b].frecv;
sol += G[nr].frecv;
q2[++r2] = nr;
}
}
void DFS(int i, long long config, int nivel)
{
if(G[i].fiu1)
{
DFS(G[i].fiu1, (config<<1), nivel+1);
DFS(G[i].fiu2, (config<<1)+1, nivel+1);
return;
}
level[i] = nivel;
Config[i] = config;
}
void Print()
{
g<<sol<<'\n';
for(int i = 1; i <= n; i++)
{
g<<level[i]<<' '<<Config[i]<<'\n';
}
}
int main()
{
Read();
Solve();
DFS(nr,0,0);
Print();
return 0;
}