Pagini recente » Cod sursa (job #654915) | Cod sursa (job #1920293) | Cod sursa (job #1232103) | Cod sursa (job #1219826) | Cod sursa (job #1105774)
#include<fstream>
#define NMAX 1000005
using namespace std;
ifstream fin("huffman.in");
ofstream fout("huffman.out");
int n,Q1[NMAX],Q2[2*NMAX],Level[2*NMAX],L1=1,L2=1,Son[2*NMAX][2],nr;
long long F[2*NMAX],Cod[2*NMAX],sol;
int pop()
{
if(F[Q1[L1]]<F[Q2[L2]])
return Q1[L1++];
return Q2[L2++];
}
void DFS(int nod,int Niv,long long C)
{
if(Son[nod][0])
{
DFS(Son[nod][0],Niv+1,(C<<1));
DFS(Son[nod][1],Niv+1,(C<<1)+1);
}
Level[nod]=Niv;
Cod[nod]=C;
}
int main()
{
fin>>n;
for(int i=1;i<=n;i++)
{
fin>>F[i];
Q1[i]=i;
}
F[0]=(1<<30);
nr=n;
for(int a,b;L1<=n || L2<Q2[0];)
{
a=pop();
b=pop();
F[++nr]=F[a]+F[b];
sol+=F[nr];
Son[nr][0]=a;
Son[nr][1]=b;
Q2[++Q2[0]]=nr;
}
fout<<sol<<'\n';
DFS(nr,0,0);
for(int i=1;i<=n;i++)
fout<<Level[i]<<' '<<Cod[i]<<'\n';
return 0;
}