Cod sursa(job #470849)

Utilizator ooctavTuchila Octavian ooctav Data 15 iulie 2010 19:27:26
Problema Coduri Huffman Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.22 kb
#include<cstdio>
#include<iostream>
using namespace std;

const int NMAX = 1000005;
const int INF = 1<<30;

struct nod
{
	int val;
	int fiu[2];
}Heap[2 * NMAX + 1];

int N;
int fol[2 * NMAX + 1];
int REZ;
int lg_sir[NMAX], baza_10[NMAX];

void citi()
{
	cin >> N;
	for(int i = 1 ; i <= N ; i++)
		cin >> Heap[i].val;
}

void construi()
{
	int cr = N;
	for(int l = N - 1 ; l ; l--)
	{
		++cr;
		for(int i = 0 ; i < 2 ; i++)
		{
			int minim = INF, poz;
			for(int j = 1 ; j < cr ; j++)
				if(!fol[j] && Heap[j].val < minim)
				{
					minim = Heap[j].val;
					poz = j;
				}
			fol[poz] = 1;
			Heap[cr].fiu[i] = poz;
			Heap[cr].val += minim;
		}
		REZ += Heap[cr].val;
	}
	
}

void dfs(int nod, int sir, int nivel)
{
	if(Heap[nod].fiu[0])
	{
		dfs(Heap[nod].fiu[0], 2 * sir, nivel + 1);
		dfs(Heap[nod].fiu[1], 2 * sir + 1, nivel + 1);
		return;
	}
	lg_sir[nod] = nivel;
	baza_10[nod] = sir;
}

void scrie()
{
	printf("%d\n", REZ);
	for(int i = 1 ; i <= N ; i++)
		printf("%d %d\n", lg_sir[i], baza_10[i]);
}

int main()
{
	freopen("huffman.in", "r", stdin);
	freopen("huffman.out", "w", stdout);
	citi();
	construi();
	dfs(2 * N - 1, 0, 0);
	scrie();
	return 0;
}