Cod sursa(job #822938)

Utilizator andu04Popa Andi andu04 Data 24 noiembrie 2012 12:00:43
Problema Coduri Huffman Scor 0
Compilator c Status done
Runda Arhiva educationala Marime 1.9 kb
#include "stdio.h"
#include "malloc.h"

#define NMAX 200001

struct nod{
	int inf;
	int f[2];	
};
struct codare{
	int COD;
	int LUNG;
};
typedef struct nod nod;
typedef struct codare codare;
void push(int x, int *H, nod *A)
{
	int aux;
	while (x > 1 && A[H[x]].inf < A[H[x/2]].inf)
	{
		aux=H[x];
        H[x]=H[x/2];
        H[x/2]=aux;
        /*P[H[x]]=x;
        P[H[x/2]]=x/2;
		*/
        x/=2;
	}
}

void sift_down(int *H,int i,int l,nod *A)
{
	int fiu = i,aux;
	if (2*i <=l && A[H[2*i]].inf < A[H[i]].inf)
		fiu = 2*i;
	if (2*i+1 <=l && A[H[2*i+1]].inf < A[H[fiu]].inf)
		fiu = 2*i+1;
	if (i!=fiu)
	{
		aux = H[fiu];
		H[fiu] = H[i];
		H[i] = aux;
		sift_down(H,fiu,l,A);
	}
}
void dsf(nod *A,codare *C,int start,int *cost,int cod,int dim)
{
	if (A[start].f[0] != 0 && A[start].f[1] != 0)
	{
		(*cost) += A[start].inf;
		dsf(A,C,A[start].f[0],&(*cost),cod << 1,dim + 1);
		dsf(A,C,A[start].f[1],&(*cost),(cod << 1) + 1, dim + 1);
	}
	else
	{
		C[start].COD = cod;
		C[start].LUNG = dim;
	}
		
}
int main()
{
	int i,n, *H, cost = 0, l = 0, m, min1, min2;
	nod *A;
	codare *C;
	freopen("huffman.in","r",stdin);
	freopen("huffman.out","w",stdout);
	scanf_s("%d",&n);

	H = (int*)calloc(n+1,sizeof(int));
	A = (struct nod*)calloc(2*n+1,sizeof(nod));
	C = (struct codare*)calloc(n+1,sizeof(codare));

	for (i = 1; i <= n; i++)
	{
		scanf_s("%d",&A[i].inf);
		l++;
		H[l] = i;
		push(l,H,A);
		A[i].f[0] = 0; 
		A[i].f[1] = 0;

	}
	m = n;
	while (l >= 2)
	{
		min1 = H[1];
		H[1] = H[l];
		l--;
		sift_down(H,1,l,A);
		
		min2 = H[1];
		H[1] = H[l];
		l--;
		sift_down(H,1,l,A);
		
		A[++n].inf = A[min1].inf + A[min2].inf;
		A[n].f[0] = min1;
		A[n].f[1] = min2;
		H[++l] = n;
		push(l,H,A);
		

	}
	
	dsf(A,C,n,&cost,0,0);
	printf_s("%d\n",cost);
	for (i = 1; i <= m; i++)
		printf_s("%d %d\n",C[i].LUNG,C[i].COD);
	return 0;
}