Pagini recente » Monitorul de evaluare | Cod sursa (job #1111818) | Cod sursa (job #226521) | Cod sursa (job #786415) | Cod sursa (job #824837)
Cod sursa(job #824837)
#include<stdio.h>
#include<queue>
using namespace std;
FILE *f = fopen("huffman.in","r");
FILE *g = fopen("huffman.out","w");
typedef struct _nod
{
int info,poz;
_nod *st,*dr;
} nod;
#define MaxN 1000100
#define MaxP 3
int N,Sol,SolV[MaxN][MaxP];
priority_queue<pair<int,nod*> > Q;
inline void init(nod *& a,int info,int i)
{
a->info = info;
a->poz = i;
a->st = a->dr = NULL;
}
void citire(void)
{
int a;
fscanf(f,"%d ",&N);
for(int i=1;i<=N;i++)
{
fscanf(f,"%d",&a);
nod *b = new nod;
init(b,a,i);
Q.push(make_pair(-a,b));
}
}
inline void creare(nod *a,int depth,int nr)
{
if(!a)
return ;
SolV[a->poz][1] = depth;
SolV[a->poz][2] = nr;
creare(a->st,depth+1,nr*2);
creare(a->dr,depth+1,nr*2+1);
}
void Rezolvare(void)
{
for(int i=1;i<N;i++)
{
nod *nou = new nod;
nou->st = Q.top().second;
//printf("%d ",Q.top().second->info);
Q.pop();
nou->dr = Q.top().second;
//printf("%d ",Q.top().second->info);
Q.pop();
nou->info = nou->st->info + nou->dr->info;
Sol += nou->info;
//printf("%d\n",nou->info);
Q.push(make_pair(-nou->info,nou));
}
creare(Q.top().second,0,0);
}
int main()
{
citire();
Rezolvare();
fprintf(g,"%d\n",Sol);
for(int i=1;i<=N;i++)
fprintf(g,"%d %d\n",SolV[i][1],SolV[i][2]);
}