Pagini recente » Cod sursa (job #226642) | Cod sursa (job #669789) | Cod sursa (job #449397) | Cod sursa (job #1787626) | Cod sursa (job #1236066)
#include<cstdio>
#define N 1000100
#include<fstream>
#include<queue>
using namespace std;
ifstream f("huffman.in");
long long val[N],LG;
int lg[N],n,fr,csiz,qsiz,i,j;
struct nod
{
nod *l,*r;
long long fre;
int ind;
nod() {}
nod(int _ind,long long _fre,nod* _l,nod *_r)
{
ind=_ind;
fre=_fre;
l=_l;
r=_r;
}
};
nod *M[2];
queue<nod* > q,c;
void dfs(nod* x,int lvl,long long va)
{
if(x->ind)
{
lg[x->ind]=lvl;
val[x->ind]=va;
LG+=x->fre*lvl;
return;
}
if(x->l)
dfs(x->l,lvl+1,va+va);
if(x->r)
dfs(x->r,lvl+1,va+va+1);
}
int main ()
{
freopen("huffman.out","w",stdout);
f>>n;
csiz=n;
for(i=1;i<=n;++i)
{
f>>fr;
c.push(new nod(i,fr,NULL,NULL));
}
for(i=1;i<n;++i)
{
for(j=0;j<2;++j)
{
if(csiz&&(!qsiz||c.front()->fre<=q.front()->fre))
M[j]=c.front(),c.pop(),--csiz;
else
M[j]=q.front(),q.pop(),--qsiz;
}
q.push(new nod(0,M[0]->fre+M[1]->fre,M[0],M[1])),++qsiz;
}
dfs(q.front(),0,0);
printf("%lld\n",LG);
for(i=1;i<=n;++i)
printf("%d %lld\n",lg[i],val[i]);
return 0;
}