Pagini recente » Cod sursa (job #850951) | Cod sursa (job #2718815) | Cod sursa (job #2952434) | Cod sursa (job #2781894) | Cod sursa (job #398193)
Cod sursa(job #398193)
#include <stdio.h>
#include <queue>
#define N 1000001
using namespace std;
int w[N],n;
int cod[N];
int niv[N];
struct nod
{int st,dr;
long long int w;
nod (int a,int b,int c)
{st=a;
dr=b;
w=c;
}
nod()
{
}
} t[2*N];
struct comp
{bool operator() (int a,int b)
{return t[a].w>=t[b].w;
}
};
void df(int poz,int c,int nivel)
{cod[poz]=c;
niv[poz]=nivel;
if(poz>n)
{df(t[poz].st,(c<<1),nivel+1);
df(t[poz].dr,(c<<1)+1,nivel+1);
}
}
int main ()
{freopen("huffman.in","r",stdin);
freopen("huffman.out","w",stdout);
int i,a,b,s;
scanf("%d",&n);
priority_queue<int,vector<int>,comp> q;
for (i=1;i<=n;i++)
{scanf("%d",&w[i]);
t[i]=nod(0,0,w[i]);
q.push(i);
}
// for (i=1;i<=n;i++) {printf("%d ",q.top());q.pop(); } return 0;
while(q.size()>1)
{a=q.top();q.pop();
b=q.top();q.pop();
t[i]=nod(a,b,t[a].w+t[b].w);
q.push(i);
i++;
}
i--;
df(i,0,0);
s=0;
for (i=1;i<=n;i++)
{s+=w[i]*niv[i];
}
printf("%d\n",s);
for (i=1;i<n;i++)
{printf("%d %d\n",niv[i],cod[i]);
}
return 0;
}