Cod sursa(job #1546579)

Utilizator al.mocanuAlexandru Mocanu al.mocanu Data 8 decembrie 2015 12:03:58
Problema Coduri Huffman Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.77 kb
#include <stdio.h>
#include <stdlib.h>
#include <queue>
#include <vector>
#define MAX 200005
using namespace std;

typedef struct TNode {
	struct TNode** child;
	int val;
} Node;

int n, x, nr, minim;
char word[20];
Node *l[MAX], *min1, *min2;
queue<Node*> q1, q2;

void print(char word[], int n){
	printf("%d ", n);
	int pow = 1, val = 0;
	for(int i = n - 1; i >= 0; i--){
		val += pow * word[i];
		pow *= 2;
	}
	printf("%d\n", val);
}

void dfs(Node* x, char word[], int n){
	if(!x->child[0] && !x->child[1]){
		print(word, n);
		return;
	}

	if(x->child[0]){
		word[n] = 0;
		dfs(x->child[0], word, n + 1);
	}
	if(x->child[1]){
		word[n] = 1;
		dfs(x->child[1], word, n + 1);
	}
}

int main(){
	freopen("huffman.in", "r", stdin);
	freopen("huffman.out", "w", stdout);
	scanf("%d", &n);
	for(int i = 0; i < n; i++){
		scanf("%d", &x);
		l[i] = (Node*)malloc(sizeof(Node));
		l[i]->child = (Node**)malloc(2 * sizeof(Node*));
		l[i]->child[0] = NULL;
		l[i]->child[1] = NULL;
		l[i]->val = x;
		q1.push(l[i]);
	}
	nr = n;

	while(!q1.empty() || q2.size() > 1){
		l[nr] = (Node*)malloc(sizeof(Node));
		l[nr]->child = (Node**)malloc(2 * sizeof(Node*));
		if(!q1.empty()){
			minim = q1.front()->val;
			if(!q2.empty() && q2.front()->val < minim){
				min1 = q2.front();
				q2.pop();
			}
			else{
				min1 = q1.front();
				q1.pop();
			}
		}
		else{
			min1 = q2.front();
			q2.pop();
			min2 = q2.front();
			q2.pop();
		}

		if(!q1.empty()){
			minim = q1.front()->val;
			if(!q2.empty() && q2.front()->val < minim){
				min2 = q2.front();
				q2.pop();
			}
			else{
				min2 = q1.front();
				q1.pop();
			}
		}

		l[nr]->child[0] = min1;
		l[nr]->child[1] = min2;
		l[nr]->val = min1->val + min2->val;
		q2.push(l[nr++]);
	}

	printf("%d\n", l[2 * n - 2]->val);
	dfs(l[2 * n - 2], word, 0);
	return 0;
}