Pagini recente » Cod sursa (job #3152237) | Cod sursa (job #1745675) | Cod sursa (job #398004) | Cod sursa (job #2318052) | Cod sursa (job #1264033)
#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 coada1[NMAX];
int coada2[NMAX];
int st1,dr1,st2,dr2;
void dfs(int nod,lint cod,int depth){
nodes[nod].ans1=depth;
nodes[nod].ans2=cod;
if(nodes[nod].fiu_st)
dfs(nodes[nod].fiu_st,cod<<1,depth+1);
if(nodes[nod].fiu_dr)
dfs(nodes[nod].fiu_dr,(cod<<1)+1,depth+1);
}
inline int ext(){
if(st1<=dr1 && st2<=dr2){
if(nodes[coada1[st1]].frecv<nodes[coada2[st2]].frecv)
return coada1[st1++];
else
return coada2[st2++];
}
if(st1<=dr1)
return coada1[st1++];
return coada2[st2++];
}
int main()
{
ifstream cin("huffman.in");
ofstream cout("huffman.out");
int n=0,i;
cin>>n;
int poz=0;
st1=1,st2=1,dr1=n,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){
n1=ext();
n2=ext();
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';
dfs(2*n-1,0,0);
for(i=1;i<=n;i++)
cout<<nodes[i].ans1<<' '<<nodes[i].ans2<<'\n';
cin.close();
cout.close();
return 0;
}