Pagini recente » Cod sursa (job #427417) | Cod sursa (job #2970029) | Cod sursa (job #516327) | Cod sursa (job #2332793) | Cod sursa (job #1033691)
#include <cstdio>
#include <queue>
using namespace std;
int n,a[100];
unsigned long long b[100],lg;
struct nod
{
nod *s,*d;
int x;
unsigned long long y;
}*h[100];
queue<nod*> q1,q2;
void init(int i)
{
h[i]=new nod;
h[i]->s='\0';
h[i]->d='\0';
h[i]->x=i;
}
void read()
{
freopen("huffman.in","r",stdin);
scanf("%d",&n);
for(int i=0;i<n;++i)
{
init(i);
scanf("%llu",&h[i]->y);
lg+=h[i]->y;
q1.push(h[i]);
}
}
void creare_arbore()
{
char e=0;
nod *n1,*n2,*nou;
while(!e)
{
if(!q1.empty()&&!q2.empty())
{
if(q2.front()->y<q1.front()->y)
{
n1=q2.front();
q2.pop();
}
else
{
n1=q1.front();
q1.pop();
}
}
else
{
if(q1.empty())
{
n1=q2.front();
q2.pop();
}
else
{
n1=q1.front();
q1.pop();
}
}
if(!q1.empty()&&!q2.empty())
{
if(q2.front()->y<q1.front()->y)
{
n2=q2.front();
q2.pop();
}
else
{
n2=q1.front();
q1.pop();
}
}
else
{
if(q1.empty())
{
if(q2.empty()) e=1;
else
{
n2=q2.front();
q2.pop();
}
}
else
{
n2=q1.front();
q1.pop();
}
}
if(e) h[0]=n1;
else
{
nou=new nod;
nou->s=n1;
nou->d=n2;
nou->x=-1;
nou->y=n1->y+n2->y;
lg+=nou->y;
q2.push(nou);
}
}
}
void codare(nod *n,int x,unsigned long long y,unsigned long long z)
{
if(n->x!=-1)
{
a[n->x]=x;
b[n->x]=y;
}
else
{
codare(n->s,x+1,y,z*2);
codare(n->d,x+1,y+z,z*2);
}
}
void huffman()
{
creare_arbore();
codare(h[0],0,0,1);
}
void write()
{
freopen("huffman.out","w",stdout);
printf("%llu\n",lg-h[0]->y);
for(int i=0;i<n;++i)
{
printf("%d %llu\n",a[i],b[i]);
}
printf("\n");
}
int main()
{
read();
huffman();
write();
return 0;
}