Cod sursa(job #673083)

Utilizator okros_alexandruOkros Alexandru okros_alexandru Data 3 februarie 2012 20:37:38
Problema Coduri Huffman Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.21 kb
#include <fstream>
#define NMAx 1000100
#define oo (1<<30)
#define cmp(a,b) nod[a].frecv<nod[b].frecv
using namespace std;

struct arbore{int fiu[2];
			long long frecv;
			}nod[2*NMAx];
int n,LG[NMAx],Q[2][NMAx],L[2],R[2];
long long sol,B[NMAx];

void dfs(int i,long long config,int nivel) {
	
	if(nod[i].fiu[0]) {
		dfs(nod[i].fiu[0],(config<<1),nivel+1);
		dfs(nod[i].fiu[1],(config<<1)+1,nivel+1);
		}
	
	B[i]=config;
	LG[i]=nivel;
	
}
void pop(int &x) {

	if(cmp(Q[0][L[0]],Q[1][L[1]]))
		x=Q[0][L[0]++];
	else
		x=Q[1][L[1]++];
}
void citire() {
	
	int i;
	ifstream in("huffman.in");
	in>>n;
	for(i=1;i<=n;i++) {
		in>>nod[i].frecv;
		Q[0][i]=i;
		}
	in.close();
	
}
void afis() {
	
	int i;
	ofstream out("huffman.out");
	
	out<<sol<<'\n';
	for(i=1;i<=n;i++)
		out<<LG[i]<<' '<<B[i]<<'\n';
	
	out.close();
	
}
int main() {
	
	int a,b,nr;
	citire();
	
	L[0]=L[1]=1;
	R[0]=n;
	R[1]=0;
	nr=n;
	nod[0].frecv=oo;
	
	while(L[0]<=R[0]||L[1]<R[1]) {
		
		pop(a);
		pop(b);
		
		++nr;
		nod[nr].fiu[0]=a;
		nod[nr].fiu[1]=b;
		nod[nr].frecv=nod[a].frecv+nod[b].frecv;
		sol+=nod[nr].frecv;
		Q[1][++R[1]]=nr;
		
		}
	dfs(nr,0,0);
	
	afis();
	
	return 0;
}