Pagini recente » Cod sursa (job #2178373) | Cod sursa (job #1986203) | Cod sursa (job #1908438) | Cod sursa (job #738297) | Cod sursa (job #1073666)
#include <iostream>
#include <fstream>
using namespace std;
#define MaxN 1000100
#define inf (1<<30)
ifstream f ("huffman.in");
ofstream g ("huffman.out");
struct nod
{
int v;
int leg[2];
}nod[2*MaxN];
int n,viz[MaxN];
long lmax=0, lung[MaxN],baza[MaxN];
void depthf (long pos, long cod, long nivel)
{
if (nod[pos].leg[0])
{
depthf(nod[pos].leg[0],cod*2,nivel+1);
depthf(nod[pos].leg[1],cod*2+1,nivel+1);
return;
}
lung[pos]=nivel;
baza[pos]=cod;
}
void solve()
{
long k=n;int i,j,p;
for(i=n-1;i>0;i--)
{
k++;
for (j=0;j<2;j++)
{
p=0;
int minim=inf;
for(int y=1;y<k;y++)
{
if(nod[y].v<minim&& viz[y]==0)
{
p=y;
minim=nod[y].v;
}
}
viz[p]=1;
nod[k].leg[j]=p;
nod[k].v+=nod[p].v;
}
lmax+=nod[k].v;
}
depthf(k,0,0);
}
int main()
{
f>>n;
int i;
for (i=1;i<=n;i++)
f>>nod[i].v;
solve();
g<<lmax<<'\n';
for(i=1;i<=n;i++)
g<<lung[i]<<' '<<baza[i]<<'\n';
f.close();
g.close();
return 0;
}