Cod sursa(job #502833)

Utilizator VladberilaVladutz Vladberila Data 20 noiembrie 2010 16:02:53
Problema Coduri Huffman Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.79 kb
#include <fstream.h>
ifstream f("huffman.in");
ofstream g("huffman.out");
struct nod
{
	long long info;
	nod *stanga,*dreapta;
};
nod *r,**C1,**C2;
long long n,st,dr,st1,dr1,s=0,x=-1;
char cod[10000];
void citire()
{
	f>>n;
	st=st1=1;
	dr1=0;
	dr=n;
	long long i;
	C1=new nod*[n+1];
	C2=new nod*[n+1];
	for(i=1;i<=n;i++)
	{
		C1[i]=new nod;
		f>>C1[i]->info;
		C1[i]->stanga=C1[i]->dreapta=NULL;
	}
	f.close();
}
void inserareCoada(nod *x,long long &st,long long &dr)
{
	dr++;
	C2[dr]=new nod;
	C2[dr]=x;
}
void stergereCoada(long long &st,long long &dr)
{
	st++;
}
int coadaVida(long long st,long long dr)
{
	if(dr<st)
		return 1;
	return 0;
}
nod* minim()
{
	nod *min,*min1;
	if(coadaVida(st1,dr1))
	{
		min=C1[st];
		stergereCoada(st,dr);
		return min;
	}
	else
	{
		if(coadaVida(st,dr))
		{
			min=C2[st1];
			stergereCoada(st1,dr1);
			return min;
		}
		else
		{
	    	min=C1[st];
	    	min1=C2[st1];
	    	if(min->info<=min1->info)
	    	{
		    	stergereCoada(st,dr);
		    	return min;
     		}
		    else
	     	{
		    	stergereCoada(st1,dr1);
		    	return min1;
	    	}
	    }
	}
}
void creareHuffman(nod *&r)
{
	long long k;
	nod *x,*y;
	for(k=1;k<=n-1;k++)
	{
		x=minim();
		y=minim();
		r=new nod;
		r->info=x->info+y->info;
		r->stanga=x;
		r->dreapta=y;
		s+=r->info;
		inserareCoada(r,st1,dr1);
	}
}
void codifica(nod *r,long long y)
{
	if(r)
	{
		if(r->stanga==NULL && r->dreapta==NULL && r->info==y)
		{
			cod[x+1]=0;
			g<<cod;
		}
		x++;
		cod[x]='0';
		codifica(r->stanga,y);
		cod[x]='1';
		codifica(r->dreapta,y);
		x--;
	}
}
int main()
{
	citire();
	creareHuffman(r);
	g<<s<<'\n';
	for(long long i=1;i<=n;i++)
	{
		codifica(r,C1[i]->info);
		g<<'\n';
	}
	g.close();
	return 0;
}