Pagini recente » Cod sursa (job #2636045) | Cod sursa (job #1186226) | Cod sursa (job #1158023) | Cod sursa (job #132488) | Cod sursa (job #1222876)
#include<fstream>
using namespace std;
#define NMAX 1000005
ifstream fin("huffman.in");
ofstream fout("huffman.out");
struct nod
{
long long v;
int f[2];
} A[NMAX<<1];
int n,k,n1,n2,x1,x2,B[NMAX];
long long lg,C[NMAX];
void dfs(int nod, int x, long long y)
{
if (nod<=n)
B[nod]=x, C[nod]=y;
else
{
dfs(A[nod].f[0],x+1,y<<1);
dfs(A[nod].f[1],x+1,(y<<1)+1);
}
}
int main()
{
int i;
fin>>n;
for (i=1;i<=n;++i)
fin>>A[i].v;
A[n+1].v=A[1].v+A[2].v;
A[n+1].f[0]=1, A[n+1].f[1]=2;
lg=A[n+1].v;
n1=3, n2=n+1;
for (k=n+2;k<2*n;++k)
{
if (n1<n && n2<2*n-1)
{
x1=n1, x2=n2;
if (A[n1].v+A[n1+1].v<A[x1].v+A[x2].v)
x1=n1, x2=n1+1;
if (A[n2].v+A[n2+1].v<A[x1].v+A[x2].v)
x1=n2, x2=n2+1;
A[k].v=A[x1].v+A[x2].v;
A[k].f[0]=x1, A[k].f[1]=x2;
if (x1<n2) ++n1;
else ++n2;
if (x2<n2) ++n1;
else ++n2;
}
else
{
if (n1>n)
{
A[k].v=A[n2].v+A[n2+1].v;
A[k].f[0]=n2, A[k].f[1]=n2+1;
++n2, ++n2;
}
else
{
x1=n1, x2=n2;
if (A[n2].v+A[n2+1].v<A[x1].v+A[x2].v)
x1=n2, x2=n2+1;
A[k].v=A[x1].v+A[x2].v;
A[k].f[0]=x1, A[k].f[1]=x2;
if (x1<n2) ++n1, ++n2;
else ++n2, ++n2;
}
}
lg+=A[k].v;
}
fout<<lg<<"\n";
dfs(2*n-1,0,0);
for (i=1;i<=n;++i)
fout<<B[i]<<" "<<C[i]<<"\n";
return 0;
}