#include<iostream>
#include<cstdio>
#include<cstring>
#include<stack>
#include<queue>
#include<algorithm>
const int maxn=1007;
const int INF=0x3f3f3f3f;
using namespace std;
typedef struct node
{
char ch;
int weight;
int parent, lchild, rchild;
}huffNode;
void SelectionMin(huffNode T[], int k, int &x1, int &x2)
{
int min1, min2;
int d1, d2;
min1=min2=INF;
for(int i=0; i<k; i++)
{
if(T[i].weight<min1 && T[i].parent==-1)
{
min2=min1;
d2=d1;
min1=T[i].weight;
d1=i;
}
else if(T[i].weight<min2 && T[i].parent==-1)
{
min2=T[i].weight;
d2=i;
}
}
x1=d1;
x2=d2;
}
void huffman(int n, int w[], huffNode T[])
{
for(int i=0; i<2*n-1; i++)
{
T[i].parent=-1;
T[i].lchild=-1;
T[i].rchild=-1;
if(i<n)
T[i].weight=w[i];
else
T[i].weight=-1;
}
int x1,x2;
for(int k=n; k<2*n-1; k++)
{
SelectionMin(T, k, x1, x2);
T[x1].parent=T[x2].parent=k;
T[k].weight=T[x1].weight+T[x2].weight;
T[k].lchild=x1;
T[k].rchild=x2;
}
}
void Display(int n, huffNode T[])
{
for(int i=0; i<2*n-1; i++)
{
printf("%-5d %-5d %-5d %-5d %-5d\n", i, T[i].weight, T[i].parent, T[i].lchild, T[i].rchild);
}
printf("\n");
}
void getcode(int k, char str[], huffNode T[])
{
int i=0, p=0;
while(T[k].parent!=-1)
{
p=T[k].parent;
if(k==T[p].lchild)
str[i++]='0';
else
str[i++]='1';
k=p;
}
str[i]='\0';
strrev(str);
}
void huffcode(huffNode T[], int n)
{
char str[100];
memset(str, 0, sizeof(str));
for(int i=0; i<2*n-1; i++)
{
getcode(i, str, T);
printf("%d: %s\n", T[i].weight, str);
}
}
int main()
{
huffNode T[maxn];
int w[]={30, 25, 20, 10, 10, 5};
huffman(6, w, T);
Display(6, T);
huffcode(T, 6);
return 0;
}