Pagini recente » Cod sursa (job #1466583) | Cod sursa (job #3134486) | Cod sursa (job #3001193) | Cod sursa (job #315572) | Cod sursa (job #727094)
Cod sursa(job #727094)
#include<stdio.h>
#include<queue>
#define maxn 1000005
using namespace std;
struct nod{
long long v;
long f[2];
}l[2*maxn];
long long b[maxn],sol,k;
long v[maxn],lg[maxn],n;
queue <int> c;
void cit(){
FILE *f;
long i;
f=fopen("huffman.in","r");
fscanf(f,"%ld",&n);
for(i=1;i<=n;i++)
fscanf(f,"%ld",&v[i]);
fclose(f);
}
void constr(){
long p,i,min1,min2,nr;
for(i=1;i<=n;i++){
l[i].v=v[i];
l[i].f[0]=l[i].f[1]=0;
}
k=n;
p=1;
nr=n-p+1+c.size();
while(nr!=1){
if(c.empty()){
min1=p;
min2=p+1;
p+=2;
}else
if(p==n+1){
min1=c.front();
c.pop();
min2=c.front();
c.pop();
}else{
if(l[c.front()].v<l[p].v){
min1=c.front();
c.pop();
}else{
min1=p;
p++;
}
if(c.empty()){
min2=p;
p++;
}else
if(p==n+1){
min2=c.front();
c.pop();
}else{
if(l[c.front()].v<l[p].v){
min2=c.front();
c.pop();
}else{
min2=p;
p++;
}
}
}
k++;
l[k].v=l[min1].v+l[min2].v;
sol+=l[k].v;
l[k].f[0]=min1;
l[k].f[1]=min2;
c.push(k);
nr=n-p+1+c.size();
}
}
void df(long k,long long cod,long niv){
if(l[k].f[0]){
df(l[k].f[0],cod*2,niv+1);
df(l[k].f[1],cod*2+1,niv+1);
}else{
lg[k]=niv;
b[k]=cod;
}
}
void afis(){
FILE *f;
f=fopen("huffman.out","w");
fprintf(f,"%lld\n",sol);
for(long i=1;i<=n;i++)
fprintf(f,"%ld %lld\n",lg[i],b[i]);
fclose(f);
}
int main(){
cit();
constr();
df(k,0,0);
afis();
return 0;
}