Pagini recente » Cod sursa (job #2821289) | Cod sursa (job #1765970) | Cod sursa (job #2821256) | Cod sursa (job #1659176) | Cod sursa (job #1264064)
#include <fstream>
#define NMAX 1000005
#define lint long long int
using namespace std;
struct nod{
int fiu_st,fiu_dr,ans1;
lint frecv;
lint ans2;
nod(int fiu_st=0, int fiu_dr=0,int ans1=0, lint frecv=0, lint ans2=0): fiu_st(fiu_st), fiu_dr(fiu_dr), ans1(ans1), frecv(frecv), ans2(ans2) {}
}nodes[2*NMAX];
int depth;
lint cod;
void dfs(int nod){
nodes[nod].ans1=depth;
nodes[nod].ans2=cod;
cod<<=1;
depth++;
if(nodes[nod].fiu_st)
dfs(nodes[nod].fiu_st);
if(nodes[nod].fiu_dr){
cod++;
dfs(nodes[nod].fiu_dr);
cod--;
}
depth--;
cod>>=1;
}
int coada1[NMAX],coada2[NMAX];
int main()
{
ifstream cin("huffman.in");
ofstream cout("huffman.out");
ios_base::sync_with_stdio(false);
int n=0,i;
cin>>n;
int poz=0;
int st1=1,dr1=n,st2=1,dr2=0;
for(i=1;i<=n;i++){
cin>>nodes[++poz].frecv;
coada1[i]=i;
}
lint ans=0;
int n1,n2;
while(dr1-st1+dr2-st2+1){
if(st1<=dr1 && st2<=dr2){
if(nodes[coada1[st1]].frecv<nodes[coada2[st2]].frecv)
n1=coada1[st1++];
else
n1=coada2[st2++];
}
else if(st1<=dr1)
n1=coada1[st1++];
else
n1=coada2[st2++];
if(st1<=dr1 && st2<=dr2){
if(nodes[coada1[st1]].frecv<nodes[coada2[st2]].frecv)
n2=coada1[st1++];
else
n2=coada2[st2++];
}
else if(st1<=dr1)
n2=coada1[st1++];
else
n2=coada2[st2++];
nodes[++poz].fiu_st=n1;
nodes[poz].fiu_dr=n2;
nodes[poz].frecv=nodes[n1].frecv+nodes[n2].frecv;
ans+=nodes[poz].frecv;
coada2[++dr2]=poz;
}
cout<<ans<<'\n';
cod=0;
depth=0;
dfs(2*n-1);
for(i=1;i<=n;i++)
cout<<nodes[i].ans1<<' '<<nodes[i].ans2<<'\n';
cin.close();
cout.close();
return 0;
}