Cod sursa(job #1222499)

Utilizator Luncasu_VictorVictor Luncasu Luncasu_Victor Data 23 august 2014 14:12:34
Problema Coduri Huffman Scor 65
Compilator cpp Status done
Runda Arhiva educationala Marime 1.43 kb
#include <iostream>
#include <iomanip>
#include <fstream>
#include <cstdio>
#include <cmath>
#include <cstring>
#include <vector>
#include <set>
#include <algorithm>
using namespace std;
#define MAX 1000010

struct Node {
	int Freq, L;
	long long Code;
	struct Node *Left, *Right;
	Node() {
		L = 0;
		Code = 0;
		Freq = 0;
		Left = Right = 0;
	}
};

struct NodeCompare{
	bool operator() (const Node *A, const Node*B) {
		return A->Freq < B->Freq;
	}
};

vector<Node*> A;
multiset<Node*,NodeCompare>H;
int N;
long long Sol;

void Huffman() {
	Node *X, *Y, *Z;
	while (H.size() > 1) {
		X = *H.begin();
		H.erase(H.begin());
		Y = *H.begin();
		H.erase(H.begin());
		Z = new Node();
		Z->Freq = X->Freq + Y->Freq;
		Z->Left = X;
		Z->Right = Y;
		H.insert(Z);
	}
}

void DFS(Node *X, int L, long long Code) {
	Node *A = X;
	if (A->Left == 0 && A->Right == 0) {
		A->L = L;
		A->Code = Code;
		Sol += A->L * A->Freq;
	} else {
		DFS(A->Left, L+1, (Code<<1));
		DFS(A->Right, L+1, (Code<<1) + 1);
	}
}

int main() {

	freopen("huffman.in","r",stdin);
	freopen("huffman.out","w",stdout);
	scanf("%d", &N);
	
	A.resize(N);
	for (int i = 0; i < N; i++) {
		A[i] = new Node();
		scanf("%d", &A[i]->Freq);
		H.insert(A[i]);
	}
	
	Huffman();
	DFS(*H.begin(), 0, 0);
	
	printf("%lld\n", Sol);
	for (int i = 0; i < A.size(); i++) {
		printf("%d %lld\n", A[i]->L, A[i]->Code);
	}
	
	return 0;
}