Pagini recente » Cod sursa (job #773174) | Istoria paginii runda/bkt2_oct2011 | Cod sursa (job #2445487) | Statistici Dobre Catalin (Catalin1D) | Cod sursa (job #696571)
Cod sursa(job #696571)
#include<stdio.h>
#include<queue>
#include<vector>
#define MAX 1000000
using namespace std;
struct nod
{
int freq,ind;
vector<nod> childs;
};
struct cmp
{
bool operator()(const nod &a,const nod &b)
{
if(a.freq!=b.freq)return a.freq>b.freq;
else return a.ind>b.ind;
}
};
int n,size=0;
priority_queue<nod,vector<nod>,cmp> Q;
int freqs[MAX],nivs[MAX],nrs[MAX];
void expand()
{
nod n;
n.childs.push_back(Q.top());
Q.pop();
n.childs.push_back(Q.top());
Q.pop();
n.freq=n.childs[0].freq+n.childs[1].freq;
Q.push(n);
}
void df(nod n,int niv,int nr)
{
if(n.childs.size()>0)
{
df(n.childs[0],niv+1,nr*2);
df(n.childs[1],niv+1,nr*2+1);
}
else
{
nivs[n.ind]=niv;
nrs[n.ind]=nr;
}
}
int main()
{
freopen("huffman.in","r",stdin);
freopen("huffman.out","w",stdout);
scanf("%d\n",&n);
for(int i=0;i<n;i++)
{
int x;
scanf("%d\n",&x);
nod n;
n.freq=x;
freqs[i]=x;
n.ind=i;
Q.push(n);
}
while(Q.size()>1)expand();
df(Q.top(),0,0);
int s=0;
for(int i=0;i<n;i++)s+=freqs[i]*nivs[i];
printf("%d\n",s);
for(int i=0;i<n;i++)//printf("%s\n",codS[i].c_str());
{
printf("%d %d\n",nivs[i],nrs[i]);
}
}