Pagini recente » Cod sursa (job #1375687) | Cod sursa (job #3234103) | Cod sursa (job #420556) | Cod sursa (job #1024688) | Cod sursa (job #978297)
Cod sursa(job #978297)
#include <iostream>
#include <fstream>
using namespace std;
struct nod
{
nod *ant,*dr,*st;
unsigned long long inf;
} *p,*q,*rad;
struct sir
{
sir *urm;
nod *attach;
} *prim,*ps,*ultim;
struct localizer
{
nod *urm;
} loc[1000002];
int v[1000002],n,i,l,c;
unsigned long long s;
int main(void)
{
FILE * f;
f=fopen("huffman.in","r");
ofstream g("huffman.out");
fscanf(f,"%d",&n);
for (i=1;i<=n;i++)
fscanf(f,"%d",&v[i]);
p=new(nod);
p->ant=NULL;
q=new(nod);
q->inf=v[1]*10;
p->st=q;
q->st=q->dr=NULL;
q->ant=p;
loc[1].urm=q;
q=new(nod);
q->inf=v[2]*10+1;
q->st=q->dr=NULL;
p->dr=q;
p->inf=v[1]+v[2];
loc[2].urm=q;
q->ant=p;
s=s+p->inf;
ps=new(sir);
ps->attach=p;
ps->urm=NULL;
ultim=prim=ps;
i=3;
while (i<=n)
if ((i<=n-1)&&(v[i]+v[i+1]<v[i]+prim->attach->inf))
{
p=new(nod);
p->ant=NULL;
q=new(nod);
q->inf=v[i]*10;
loc[i].urm=q;
q->st=q->dr=NULL;
q->ant=p;
p->st=q;
q=new(nod);
q->ant=p;
q->inf=v[i+1]*10+1;
loc[i+1].urm=q;
q->st=q->dr=NULL;
p->dr=q;
p->inf=v[i]+v[i+1];
s=s+p->inf;
ps=new(sir);
ps->attach=p;
ps->urm=NULL;
ultim->urm=ps;
ultim=ps;
i=i+2;
}
else
if ((prim->urm==NULL)||(v[i]+prim->attach->inf<(prim->attach->inf+prim->urm->attach->inf)))
{
p=new(nod);
p->ant=NULL;
q=new(nod);
q->ant=p;
q->inf=v[i]*10;
loc[i].urm=q;
q->st=q->dr=NULL;
p->st=q;
q=prim->attach;
q->ant=p;
p->inf=v[i]+q->inf;
s=s+p->inf;
q->inf=(q->inf)*10+1;
p->dr=q;
ps=new(sir);
ps->urm=NULL;
ps->attach=p;
ultim->urm=ps;
ultim=ps;
ps=prim;
prim=prim->urm;
delete(ps);
i++;
}
else
{
p=new(nod);
p->ant=NULL;
q=prim->attach;
q->ant=p;
q->inf=(q->inf)*10;
p->dr=q;
q=prim->urm->attach;
q->ant=p;
q->inf=(q->inf)*10+1;
p->st=q;
p->inf=(p->dr->inf+p->st->inf)/10;
s=s+p->inf;
ps=new(sir);
ps->urm=NULL;
ps->attach=p;
ultim->urm=ps;
ultim=ps;
ps=prim;
prim=prim->urm;
delete(ps);
ps=prim;
prim=prim->urm;
delete(ps);
}
while (prim!=ultim)
{
p=new(nod);
p->ant=NULL;
q=prim->attach;
q->ant=p;
q->inf=(q->inf)*10;
p->dr=q;
q=prim->urm->attach;
q->ant=p;
q->inf=(q->inf)*10+1;
p->st=q;
p->inf=(p->dr->inf+p->st->inf)/10;
s=s+p->inf;
ps=new(sir);
ps->urm=NULL;
ps->attach=p;
ultim->urm=ps;
ultim=ps;
ps=prim;
prim=prim->urm;
delete(ps);
ps=prim;
prim=prim->urm;
delete(ps);
}
rad=prim->attach;
g<<s<<'\n';
for (i=1;i<=n;i++)
{
p=loc[i].urm;
c=0;
l=0;
while (p!=rad)
{
c=c*2+(p->inf)%10;
l++;
p=p->ant;
}
g<<l<<' '<<c<<'\n';
}
g.close();
return 0;
}