Pagini recente » Cod sursa (job #2278521) | Cod sursa (job #563365) | Cod sursa (job #2106132) | Cod sursa (job #1964166) | Cod sursa (job #1193065)
#include <iostream>
#include <fstream>
#include <queue>
using namespace std;
ifstream fin("huffman.in");
ofstream fout("huffman.out");
#define MAX 1000100
struct node{
long long val;
int st, dr;
};
node *p;
node nod[2*MAX];
queue <int> Q1, Q2;
int n, i, x;
int take_min()
{
int x;
if(Q1.empty())
{
x=Q2.front();
Q2.pop();
return x;
}
if(Q2.empty())
{
x=Q1.front();
Q1.pop();
return x;
}
if(nod[Q2.front()].val<nod[Q1.front()].val)
{
x=Q2.front();
Q2.pop();
return x;
}
x=Q1.front();
Q1.pop();
return x;
}
long long nr;
int lg;
int ln[MAX];
long long number[MAX];
void df(int rad)
{
if(!nod[rad].st)
{
ln[rad]=lg;
number[rad]=nr;
return;
}
lg++;
nr*=2;
df(nod[rad].st);
nr++;
df(nod[rad].dr);
nr/=2;
lg--;
}
int main()
{
int d=0;
fin>>n;
for(i=1;i<=n;i++)
{
++d;
fin>>x;
nod[d].val=x;
Q1.push(d);
}
int i1, i2;
long long s=0;
for(i=1;i<n;i++)
{
i1=take_min();
i2=take_min();
d++;
nod[d].val=nod[i1].val+nod[i2].val;
nod[d].st=i1;
nod[d].dr=i2;
s+=nod[d].val;
Q2.push(d);
}
int rad=d;
fout<<s<<"\n";
df(rad);
for(i=1;i<=n;i++)
{
fout<<ln[i]<<" "<<number[i]<<"\n";
}
}