Pagini recente » Cod sursa (job #3199959) | Monitorul de evaluare | Cod sursa (job #350333) | Cod sursa (job #787171) | Cod sursa (job #1193061)
#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;
node *st, *dr;
int v;
};
node *p;
queue <node*> Q1, Q2;
int n, i, x;
node* take_min()
{
node* x;
if(Q1.empty())
{
x=Q2.front();
Q2.pop();
return x;
}
if(Q2.empty())
{
x=Q1.front();
Q1.pop();
return x;
}
if(Q2.front()->val<Q1.front()->val)
{
x=Q2.front();
Q2.pop();
return x;
}
x=Q1.front();
Q1.pop();
return x;
}
int lg;
int ln[MAX];
long long number[MAX];
void df(node* rad, long long nr)
{
if(rad->st==rad->dr)
{
ln[rad->v]=lg;
number[rad->v]=nr;
return;
}
lg++;
df(rad->st, nr*2);
df(rad->dr, nr*2+1);
lg--;
}
int main()
{
fin>>n;
for(i=1;i<=n;i++)
{
fin>>x;
p=new node;
p->val=x;
p->v=i;
p->st=0;
p->dr=0;
Q1.push(p);
}
node *i1, *i2;
long long s=0;
for(i=1;i<n;i++)
{
i1=take_min();
i2=take_min();
p=new node;
p->val=i1->val+i2->val;
p->st=i1;
p->dr=i2;
s+=p->val;
Q2.push(p);
}
node* rad=take_min();
fout<<s<<"\n";
df(rad, 0);
for(i=1;i<=n;i++)
{
fout<<ln[i]<<" "<<number[i]<<"\n";
}
}