Pagini recente » Cod sursa (job #1949323) | Cod sursa (job #1132815) | Cod sursa (job #965713) | Cod sursa (job #1154125) | Cod sursa (job #2483205)
#include <cstdio>
#define DIMN 1000010
#define INF 1000000000000000000
using namespace std;
long long sol = 0;
int nodes,root , n;
long long fq[2*DIMN] , code[2*DIMN];
int leaf[DIMN] , intern[DIMN] , left[2*DIMN] , right[2*DIMN] , level[2*DIMN];
int conf[DIMN];
void build_huffman_tree (){
int pleaf,uleaf,pint,uint,ma,mb,tip , i;
long long mini;
pleaf = pint = 1;
uint = uleaf = 0;
for (i=1;i<=n;i++)
leaf[++uleaf] = i;
/// 2 deque uri , leaf si intern
while (uleaf - pleaf + 1 + uint - pint + 1 > 1){
/// alegi cele mai mici doua noduri
mini = INF;
ma = mb = 0;
tip = 0;
if (uleaf - pleaf + 1 >= 1){
if (mini > fq[leaf[pleaf]] ){
mini = fq[leaf[pleaf]];
ma = leaf[pleaf];
tip = 1;
}
}
if (uint - pint + 1 >= 1){
if (mini > fq[intern[pint]] ){
mini = fq[intern[pint]];
ma = intern[pint];
tip = 0;
}
}
if (tip == 1)
pleaf++;
else pint++;
mini = INF;
tip = 0;
if (uleaf - pleaf + 1 >= 1){
if (mini > fq[leaf[pleaf]] ){
mini = fq[leaf[pleaf]];
mb = leaf[pleaf];
tip = 1;
}
}
if (uint - pint + 1 >= 1){
if (mini > fq[intern[pint]] ){
mini = fq[intern[pint]];
mb = intern[pint];
tip = 0;
}
}
if (tip == 1)
pleaf++;
else pint++;
/// ai ales nodurile ma si mb
nodes++;
fq[nodes] = fq[ma] + fq[mb];
sol+=fq[nodes];
left[nodes] = ma;
right[nodes] = mb; /// vecini
intern[++uint] = nodes;
//printf ("%d %lld %d %d\n" , nodes , fq[nodes] , ma , mb);
}
root = intern[uint];
}
void dfs (int nod , long long cod){
if (nod<=n){ /// FRUNZA
code[nod] = cod;
return;
}
level[right[nod]] = level[left[nod]] = 1 + level[nod];
dfs (left[nod] , cod*2);
dfs (right[nod] , cod*2 + 1);
}
int main()
{
FILE *fin = fopen ("huffman.in","r");
FILE *fout = fopen ("huffman.out","w");
int i;
fscanf (fin,"%d",&n);
nodes = n;
sol = 0;
for (i=1;i<=n;i++){
fscanf (fin,"%lld",&fq[i]);
}
build_huffman_tree ();
dfs(root , 0);
fprintf (fout,"%lld\n",sol);
for (i=1;i<=n;i++){
fprintf (fout,"%d %lld\n",level[i] , code[i]);
}
return 0;
}