Cod sursa(job #3137491)

Utilizator thinkphpAdrian Statescu thinkphp Data 13 iunie 2023 08:39:14
Problema Coduri Huffman Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.74 kb
#include <iostream>
#include <fstream>
#include <queue>
#include <algorithm>

using namespace std;

#define infile "huffman.in"
#define outfile "huffman.out"

#define NMAX 1000000


long long lg[NMAX], val[NMAX];

typedef struct node {
	long long freq;
	int index;
	struct node *right, *left;
} node;

node *connect(node *a, node *b) {

	node *result = new node;

	result->freq = a->freq + b->freq;
	result->left = a;
	result->right = b;
	return result;
}

node *get_min(queue<node*> *fq, queue<node*> *sq) {
	node *min = NULL;
	if (fq->empty()) {
		min = sq->front();
		sq->pop();
	} else if (sq->empty()) {
		min = fq->front();
		fq->pop();
	} else if (fq->front()->freq <= sq->front()->freq) {
		min = fq->front();
		fq->pop();
	} else {
		min = sq->front();
		sq->pop();
	}

	return min;
}


void dfs(node *nd, long long value, long long len) {

	if (nd->left == NULL) {
		lg[nd->index] = len;
		val[nd->index] = value;
		return;
	}
	
	dfs(nd->left, value * 2, len + 1);
	dfs(nd->right, value * 2 + 1, len + 1);
}

FILE *fin, *fout;

int main() {

	fin = freopen(infile, "r", stdin);
	fout = freopen(outfile, "w", stdout);

	int n;
	scanf("%d", &n);

	queue<node*> *fq, *sq;

	fq = new queue<node*>();
	sq = new queue<node*>();

	long long sol = 0;

	for (int i = 0; i < n; i++) {
		node *nd = new node;
		scanf("%lld", &nd->freq);
		nd->index = i;
		nd->right = nd->left = NULL;
		fq->push(nd);
	}

	node *root;

	while (true) {
		node *a = get_min(fq, sq);
		node *b = get_min(fq, sq);
		sq->push(connect(a,b));

		sol += sq->back()->freq;	
		if (sq->size() == 1 && fq->empty()) {
	 		root = sq->front();
			break;
		}
	}

	dfs(root, 0, 0);

	printf("%lld\n", sol);
	for (int i = 0; i < n; i++) 
		printf("%lld %lld\n", lg[i], val[i]);

	delete fq;
	delete sq;
	return 0;
}