Cod sursa(job #968204)

Utilizator dropsdrop source drops Data 1 iulie 2013 21:08:41
Problema Coduri Huffman Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.27 kb
#include <iostream>
#include <fstream>
#include <cmath>
#include <vector>
#include <bitset>
#include <queue>
#include <deque>
#include <list>
#include <set>
#include <ctime>
#include <string>
#include <cstring>
#include <iomanip>
#include <algorithm>
using namespace std;
ifstream ff("huffman.in");
ofstream gg("huffman.out");
#define max 1000001

struct huf{ long long v; int k; struct huf *s,*d; 
	huf(int v0=0,int k0=0){v=v0;k=k0;s=d=0;}
	huf(int v0, huf *s0, huf *d0,int k0){v=v0;s=s0;d=d0;k=k0;} }*h;
int n, vv[max], ll[max];

struct cmp{
	bool operator()(const huf* a,const huf* b){
		return a->v<b->v;
	}
};

multiset<huf*,cmp> ss;

long long dfs(huf *r,int k,int x){
	long long l=0;
	if(r->s==0 && r->d==0){
		vv[r->k]=x;
		ll[r->k]=k;
		return k*r->v;
	}
	if(r->s!=0) l+=dfs(r->s,k+1,2*x);  
	if(r->d!=0) l+=dfs(r->d,k+1,2*x+1);
	return l;
}

void arb(){
	huf *s,*d;
	while(ss.size()>1){
		s=*ss.begin(); ss.erase(ss.begin());
		d=*ss.begin(); ss.erase(ss.begin());
		ss.insert(new huf(s->v+d->v, s, d, -1));
	}
	h=*ss.begin();
	cout << dfs(h,0,0) << endl;
	for(int i=0;i<n;i++) gg << ll[i] << " " << vv[i] << "\n";
}

int main(){
	ff >> n;
	for(int i=0;i<n;i++){
		ff >> vv[i];
		ss.insert(new huf(vv[i],i));
	}
	arb();
}