Cod sursa(job #1065754)

Utilizator miu_mik93FMI - Paduraru Miruna miu_mik93 Data 23 decembrie 2013 17:41:10
Problema Coduri Huffman Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.61 kb
#include <iostream>
#include <string>
#include <stdlib.h>
#include <assert.h>
#include <time.h>
#include <algorithm>
#include <vector>
#include <cstdio>
#include <cstring>
#include <fstream>
#include <queue>
#include <cstdlib>
#include <iomanip>
#include <cmath>
#include <stdarg.h>
#include <stdio.h>
#include <set>
using namespace std;
//#include <unordered_map>
#define NMAX 1000001
#define INF (1 << 30)

struct nod
{
	int value;
	int connection[2];
}myArray[NMAX];

int n, viz[NMAX];
long sum, height[NMAX], codes[NMAX];


void DFS (long poz, long cod, long nivel)
{
	if ( myArray[poz].connection[0] )
	{
		DFS (myArray[poz].connection[0], 2 * cod, nivel + 1);
		DFS (myArray[poz].connection[1], 2 * cod + 1, nivel + 1);
	}
	height[poz] = nivel;
	codes[poz] = cod;
}

void doTies ()
{
	long k = n;

	for (int i = n-1; i > 0; i--)
	{
		++k;
		for (int j = 0; j < 2; j++)
		{
			int min = INF, copy = 0;

			for (int z = 1; z < k; z++)
			{
				if ( myArray[z].value < min && !viz[z] )
				{
					copy = z;
					min = myArray[z].value;
				}
			}
			viz[copy] = 1;
			myArray[k].connection[j] = copy;
			myArray[k].value += myArray[copy].value;
		}
		sum += myArray[k].value;
	}
	DFS (k, 0, 0);
}


int main()
{
	FILE *f = fopen ("huffman.in", "r");
	FILE *g = fopen ("huffman.out", "w");

	fscanf (f, "%d", &n);
	for (int i = 1; i <= n; i++)
	{
		fscanf (f, "%d", &myArray[i].value);
	}

	doTies();

	fprintf (g, "%ld\n", sum);
	for (int i = 1; i <= n; i++)
	{
		fprintf(g, "%ld %ld\n", height[i], codes[i]);
	}

	fclose(f);
	fclose(g);
	return 0;
}