Cod sursa(job #727094)

Utilizator dragosnicolaeNicolae Dragos dragosnicolae Data 27 martie 2012 19:04:57
Problema Coduri Huffman Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.54 kb
#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;
}