Mai intai trebuie sa te autentifici.
Cod sursa(job #696584)
Utilizator | Data | 28 februarie 2012 19:06:24 | |
---|---|---|---|
Problema | Coduri Huffman | Scor | 30 |
Compilator | cpp | Status | done |
Runda | Arhiva educationala | Marime | 1.38 kb |
#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];
long long 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);
}
inline void df(nod n,int niv,long long 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 %lld\n",nivs[i],nrs[i]);
}
}