Cod sursa(job #2277422)

Utilizator cezar.plescaCezar Plesca cezar.plesca Data 6 noiembrie 2018 11:04:46
Problema Coduri Huffman Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.57 kb
#include<stdio.h>
#include<stdlib.h>

#include<vector>
#include<queue>
#include<set>

using namespace std;

#define NMAX 1000000

long long b[NMAX];
unsigned char lg[NMAX];

long long lung;

typedef struct nod{
	int left, right; 
	long long freq;
}nod; 

nod huff[2*NMAX]; // arborele Huffman

queue<int> freq0;
queue<int> freq1;

int N;

void deepfirst(int root,long long cod,int nivel){
	if(huff[root].right) {
        deepfirst(huff[root].left, cod<<1, nivel+1);
        deepfirst(huff[root].right, (cod<<1)+1, nivel+1);
        return;
    }
    lg[root]=nivel;
    b[root]=cod;
}

void huffman(){
	int n=N; 
	int IND[2];

	while(n<(2*N-1)){ 
		long long cost=0;

		for(int i=0;i<2;i++){
			if(!freq0.empty()){
				if(freq1.empty()){
					IND[i]=freq0.front(); freq0.pop();
				}
				else{
					if(huff[freq0.front()].freq<huff[freq1.front()].freq){
						IND[i]=freq0.front(); freq0.pop();
					}
					else{
						IND[i]=freq1.front(); freq1.pop();
					}
				}
			}
			else{
				IND[i]=freq1.front(); freq1.pop();
			}
		}
	
		huff[n].left=IND[0]; huff[n].right=IND[1];
		huff[n].freq=huff[IND[0]].freq+huff[IND[1]].freq;
		
		freq1.push(n);
		lung+=huff[n].freq;
		n++;
	}

	printf("%lld\n",lung);
	deepfirst(n-1,0,0);
}




int main(){
	freopen("huffman.in","rt",stdin);
	freopen("huffman.out","wt",stdout);
	
	scanf("%d",&N);

	int f;

	for(int i=0;i<N;i++){
		scanf("%d",&f);
		huff[i].freq=f;
		freq0.push(i);
	}

	huffman();
	
	for(int i=0;i<N;i++)
		printf("%d %lld\n",lg[i],b[i]);

	return 0;
}