Cod sursa(job #398349)

Utilizator nicolaetitus12Nicolae Titus nicolaetitus12 Data 18 februarie 2010 15:50:45
Problema Coduri Huffman Scor 65
Compilator cpp Status done
Runda Arhiva educationala Marime 1.49 kb
#include <stdio.h>
#include <deque>
#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];


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,min;
 scanf("%d",&n);
 deque<int> qi;
 deque<int> qo;

 for (i=1;i<=n;i++)
 {scanf("%d",&w[i]);
  t[i]=nod(0,0,w[i]);
  qi.push_back(i);
 }
 
 while(qi.size()+qo.size()>1)
 {if(!qi.empty()&&!qo.empty())
  {if(t[qi.front()].w<t[qo.front()].w)
   {a=qi.front();qi.pop_front();
   }
   else
   {a=qo.front();qo.pop_front();
   }
  }
  else if(!qi.empty())
  {a=qi.front();qi.pop_front();
  }
  else if(!qo.empty())
  {a=qo.front();qo.pop_front();
  }

  if(!qi.empty()&&!qo.empty())
  {if(t[qi.front()].w<t[qo.front()].w)
   {b=qi.front();qi.pop_front();
   }
   else
   {b=qo.front();qo.pop_front();
   }
  }
  else if(!qi.empty())
  {b=qi.front();qi.pop_front();
  }
  else if(!qo.empty())
  {b=qo.front();qo.pop_front();
  }
  
  t[i]=nod(a,b,t[a].w+t[b].w);
  qo.push_back(i);
  i++;
 }
 
 i--;
 df(i,0,0);
 long long int s=0;

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

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