Pagini recente » Cod sursa (job #856641) | Cod sursa (job #443423) | Cod sursa (job #2542795) | Cod sursa (job #1266453) | Cod sursa (job #381386)
Cod sursa(job #381386)
#include<fstream>
#include<string.h>
#include<math.h>
#define infinit 1000000000
#define nmax 2000000
using namespace std;
ifstream fin("huffman.in");
ofstream fout("huffman.out");
int n,z;
char a[500];
long long lg=0;
struct nod
{long long frecv;
int 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
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--)
{if(z==0)
{pmin1=prim[1];
pmin2=prim[2];
p=3;
}
else
if(p<=n && q<=z)
{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++;
}
}
}
else if(q<z)
{pmin1=coada[q];
q++;
pmin2=coada[q];
q++;
}
else
{pmin1=prim[p];
p++;
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;
}