Pagini recente » Cod sursa (job #1043213) | Cod sursa (job #1968226) | Cod sursa (job #2030989) | Cod sursa (job #2528891) | Cod sursa (job #1162595)
#include<fstream>
#include<queue>
#define inf 1LL*1000000000*1000000000
#define NMax 2000100
using namespace std;
struct tip { long long val;
int fiu[2]; } nod[NMax];
int Lg[NMax];
long long C[NMax];
queue<int> Q[2];
void DF (int crt, long long cod, int nivel)
{
if (nod[crt].fiu[0])
{
DF(nod[crt].fiu[0],2*cod,nivel+1);
DF(nod[crt].fiu[1],2*cod+1,nivel+1);
return;
}
C[crt]=cod;
Lg[crt]=nivel;
}
int main ()
{
ifstream f("huffman.in");
ofstream g("huffman.out");
int N,Nr=0,i,coada,which,elem;
long long LgT=0,Min;
f>>N;
for (i=1; i<=N; i++)
{
f>>nod[++Nr].val;
Q[0].push(i);
}
while (Q[0].size() + Q[1].size() >1)
{
Nr++;
for (elem=0; elem<2; elem++)
{
which=0, Min=inf;
for (coada=0; coada<2; coada++)
if (!Q[coada].empty())
if (nod[Q[coada].front()].val<Min)
Min=nod[Q[coada].front()].val, which=coada;
nod[Nr].fiu[elem]=Q[which].front();
nod[Nr].val+=Min;
Q[which].pop();
}
LgT+=nod[Nr].val;
Q[1].push(Nr);
}
DF(Nr,0,0);
g<<LgT<<"\n";
for (i=1; i<=N; i++)
g<<Lg[i]<<" "<<C[i]<<"\n";
return 0;
}