Cod sursa(job #398193)

Utilizator nicolaetitus12Nicolae Titus nicolaetitus12 Data 18 februarie 2010 10:33:54
Problema Coduri Huffman Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.07 kb
#include <stdio.h>
#include <queue>
#define N 1000001
using namespace std;

int w[N],n;
int cod[N];
int niv[N];

struct nod
{int st,dr;
 long long int w;
 nod (int a,int b,int c)
 {st=a;
  dr=b;
  w=c;
 }
 nod()
 {
 }
} t[2*N];

struct comp
{bool operator() (int a,int b)
 {return t[a].w>=t[b].w;
 }
};

void df(int poz,int c,int nivel)
{cod[poz]=c;
 niv[poz]=nivel;

 if(poz>n)
 {df(t[poz].st,(c<<1),nivel+1);
  df(t[poz].dr,(c<<1)+1,nivel+1);
 }
}

int main ()
{freopen("huffman.in","r",stdin);
 freopen("huffman.out","w",stdout);
 int i,a,b,s;
 scanf("%d",&n);
 priority_queue<int,vector<int>,comp> q;
 
 for (i=1;i<=n;i++)
 {scanf("%d",&w[i]);
  t[i]=nod(0,0,w[i]);
  q.push(i);
 }
// for (i=1;i<=n;i++) {printf("%d ",q.top());q.pop(); } return 0;
 while(q.size()>1)
 {a=q.top();q.pop();
  b=q.top();q.pop();

  t[i]=nod(a,b,t[a].w+t[b].w);
  q.push(i);
  i++;
 }
 i--;
 df(i,0,0);
 s=0;

 for (i=1;i<=n;i++)
 {s+=w[i]*niv[i];
 }
 printf("%d\n",s);

 for (i=1;i<n;i++)
 {printf("%d %d\n",niv[i],cod[i]);
 }
 
 return 0;
}