Pagini recente » Cod sursa (job #2556780) | Cod sursa (job #978631) | Cod sursa (job #2871943) | Cod sursa (job #2815268) | Cod sursa (job #849893)
Cod sursa(job #849893)
#include <iostream>
#include <string>
#include <fstream>
using namespace std;
ifstream in("huffman.in");
ofstream out("huffman.out");
struct nod{
int val;
int left_son;
int right_son;
bool x;
}a[2000001];
int n,n2,poz1,poz2;
void init()
{
in>>n;
for (int i=1; i<=n; i++)
{
in>>a[i].val;
a[i].left_son=NULL;
a[i].right_son=NULL;
a[i].x=true;
}
n2=n;
}
int exract_min()
{
int p,m=1000000;
for (int i=1; i<=n; i++)
if (a[i].val<m && a[i].x) { m=a[i].val; p=i; }
a[p].x=false;
return p;
}
void huffman()
{
int x,y,sum=0;
for (int i=1; i<=n2-1; i++)
{
x=exract_min();
y=exract_min();
n++;
a[n].val=a[x].val+a[y].val;
sum=sum+a[n].val;
a[n].left_son=x;
a[n].right_son=y;
a[n].x=true;
}
out<<sum<<endl;
}
void recur(string s,int p)
{
if (a[p].left_son==NULL && a[p].right_son==NULL)
{
int sum,x,m=s.length();
sum=0; x=1;
for (int i=m-1; i>=0; i--)
{
if (s[i]=='1') sum=sum+x;
x=x*2;
}
out<<m<<" "<<sum<<endl;
}
else
{
recur(s+"0",a[p].left_son);
recur(s+"1",a[p].right_son);
}
}
int main()
{
init();
huffman();
recur("",n);
return 0;
}