Cod sursa(job #696511)

Utilizator the@EyE@Postavaru Stefan the@EyE@ Data 28 februarie 2012 18:49:13
Problema Coduri Huffman Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.41 kb
#include<stdio.h>
#include<queue>
#include<vector>
#define MAX 1000000

using namespace std;

struct nod
{
    int freq,ind;
    vector<nod> childs;
};

struct cmp
{
    bool operator()(const nod &a,const nod &b)
    {
        if(a.freq!=b.freq)return a.freq>b.freq;
        else return a.ind>b.ind;
    }
};

int n,size=0;
priority_queue<nod,vector<nod>,cmp> Q;
int freqs[MAX],nivs[MAX],nrs[MAX];

void expand()
{
    nod n;
    n.childs.push_back(Q.top());
    Q.pop();
    n.childs.push_back(Q.top());
    Q.pop();
    n.freq=n.childs[0].freq+n.childs[1].freq;
    Q.push(n);
}

void df(nod n,int niv,int nr)
{
    if(n.childs.size()>0)
    {
        int pow=1;
        for(int i=0;i<niv;i++)pow*=2;
        df(n.childs[0],niv+1,nr);
        df(n.childs[1],niv+1,nr+pow);
    }
    else
    {
        nivs[n.ind]=niv;
        nrs[n.ind]=nr;
    }
}



int main()
{
    freopen("huffman.in","r",stdin);
    freopen("huffman.out","w",stdout);

    scanf("%d\n",&n);
    for(int i=0;i<n;i++)
    {
        int x;
        scanf("%d\n",&x);
        nod n;
        n.freq=x;
		freqs[i]=x;
        n.ind=i;
        Q.push(n);
    }

    while(Q.size()>1)expand();
    df(Q.top(),0,0);

	int s=0;
	for(int i=0;i<n;i++)s+=freqs[i]*nivs[i];
	printf("%d\n",s);

	for(int i=0;i<n;i++)//printf("%s\n",codS[i].c_str());
	{
		printf("%d %d\n",nivs[i],nrs[i]);
	}
}