Cod sursa(job #381344)

Utilizator PopaStefanPopa Stefan PopaStefan Data 10 ianuarie 2010 13:51:15
Problema Coduri Huffman Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 2.47 kb
#include<fstream>
#include<string.h>
#include<math.h>
#define infinit 100000000
#define nmax 1000000

using namespace std;

ifstream fin("huffman.in");
ofstream fout("huffman.out");

int n,z;
char a[1000];
long long lg=0;

struct nod
  {long long frecv;
   long cod,lungime; //in baza 10
   nod *st,*dr;
  };
nod *prim[nmax];
nod *coada[nmax];

void creare()
{int i,k,p=1,q=1;  //p nivelul in coada cu nodurile initiale (frunze);
long long frecventa;  //q nivelul in coada cu nodurile interne
long long min1,min2;
nod *pmin1, *pmin2;
fin>>n;
for(i=1;i<=n;i++)
  {fin>>frecventa;
   prim[i]=new nod;
   prim[i]->frecv=frecventa;
   prim[i]->st=prim[i]->dr=NULL;
  }
for(k=n-1;k>=1;k--)
  {min1=min2=infinit;
   if(z==0)
      {pmin1=prim[1];
       pmin2=prim[2];
       p=3;
      }
    else {if(prim[p]->frecv<coada[q]->frecv) {pmin1=prim[p];
                                              p++;
                                              if(p<=n && prim[p]->frecv<coada[q]->frecv)
                                               {pmin2=prim[p];
                                                p++;
                                               }
                                              else {pmin2=coada[q];
                                                   q++;
                                                   }
                               }
            else
               {pmin1=coada[q];
                q++;
                if(q<=z && coada[q]->frecv<prim[p]->frecv)
                  {pmin2=coada[q];
                   q++;
                  }
                 else {pmin2=prim[p];
                       p++;
                      }
               }
         }
   z++;
   coada[z]=new nod;
   coada[z]->frecv=pmin1->frecv+pmin2->frecv;
   coada[z]->st=pmin1;
   coada[z]->dr=pmin2;
  }
}

long long transformare(char a[1000])
{long long x=0;
int l,v;
for(l=strlen(a)-1,v=0;l>=0;l--,v++)
  if(a[l]=='1')
    x=x+pow(2,v);
return x;
}

void dfs(nod *tata,int poz)
{if(tata->st!=NULL)
  {a[poz]='0';
   dfs(tata->st,poz+1);
   a[poz]='1';
   dfs(tata->dr,poz+1);
  }
 else {a[poz]='\0';
       tata->lungime=poz;
       lg=lg+poz*tata->frecv;
       tata->cod=transformare(a);
      }
}

int main()
{creare(); //arbore Huffman
dfs(coada[z],0); //parcurgere si creeare coduri
fout<<lg<<'\n';
for(int i=1;i<=n;i++)
  fout<<prim[i]->lungime<<" "<<prim[i]->cod<<'\n';
fin.close();
fout.close();
return 0;
}