Cod sursa(job #2256703)

Utilizator b10nd3Oana Mancu b10nd3 Data 8 octombrie 2018 23:36:47
Problema Coduri Huffman Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.67 kb
#include<iostream>
#include<fstream>
#include<queue>

using namespace std;

#define maxn 1000100
#define inf 1LL * 1000000000 * 1000000000

struct Node{
	long long value;
	long right,left;
};
typedef struct Node *tNode;

tNode nd[2*maxn];
queue <int> q1,q2;
int n;
long long b10[maxn];
long lg[maxn]; 
ofstream out("huffman.out");


tNode createNode(long long val, long left, long right){
	tNode node=new Node();
	node->value=val;
	node->right=right;
	node->left=left;
	return node;
}


long m(){
	long long value1=inf,value2=inf;
	long sol;
	if(q1.size()>0)
		value1=nd[ q1.front()]->value;
	if(q2.size()>0)
	    value2=nd[q2.front()]->value;
	if(value1<value2){
		sol=q1.front();
		q1.pop();
	}	
	else{
		sol=q2.front();
		q2.pop();
	}
	return sol;
}


long buildTree(){
	ifstream in("huffman.in");
	int i,k;
	tNode node1, node2;
	long long x,lg=0; 
	in>>n; 
	
	for(i=1;i<=n;i++) {
		in>>x;
		nd[i]=createNode(x,0,0);
		q1.push(i); 
	}  
	in.close();
	
	k=n;
	while(q1.size()>0 || q2.size()>1){  
	   k++; 
	   long left=m();
	   long right=m();
	   lg+=nd[left]->value+nd[right]->value;
	   nd[k]=createNode(nd[left]->value+nd[right]->value,left,right);
	   q2.push(k); 	
	}
	out<<lg<<'\n';
	return q2.back(); 
}


void readTree(long poz, long long cod, long nivel){
	if(nd[poz]->left==0 && nd[poz]->right==0){
		lg[poz]=nivel;
		b10[poz]=cod;
	}
	if(nd[poz]->left!=0)
	    readTree(nd[poz]->left,cod*2,nivel+1);     
	if(nd[poz]->right!=0)
	    readTree(nd[poz]->right,cod*2+1,nivel+1);
}


int main(){
    readTree(buildTree(),0,0);	
	for(int i=1;i<=n;i++) 
	   out<<lg[i]<<" "<<b10[i]<<'\n';    
    return 0;
}