Pagini recente » Borderou de evaluare (job #2258889) | Cod sursa (job #1790388) | Cod sursa (job #1398525) | Cod sursa (job #2773686) | Cod sursa (job #1162000)
#include<cstdio>
#include<queue>
#define inf 0x3f3f3f3f
#define NMax 1000005
using namespace std;
struct tip { int val,fiu[5]; } nod[NMax];
int C[NMax],Lg[NMax];
queue<int> Q[5];
void DF (int crt, int 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);
}
else
{
C[crt]=cod;
Lg[crt]=nivel;
}
}
int main ()
{
int N,Nr=0,i,LgT=0,coada,which,elem,Min;
freopen("huffman.in","r",stdin);
freopen("huffman.out","w",stdout);
scanf("%d",&N);
for (i=1; i<=N; i++)
{
scanf("%d",&nod[++Nr].val);
Q[0].push(i);
}
while (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;
if (!Q[0].empty() || !Q[1].empty())
Q[1].push(Nr);
else break;
}
DF(Nr,0,0);
printf("%d\n",LgT);
for (i=1; i<=N; i++)
printf("%d %d\n",Lg[i],C[i]);
return 0;
}