Pagini recente » Cod sursa (job #341408) | Cod sursa (job #2118595) | Cod sursa (job #684023) | Cod sursa (job #2699308) | Cod sursa (job #673105)
Cod sursa(job #673105)
#include <fstream>
#include <iostream>
#define NMAx 1000100
#define oo 1LL*(1<<30)
#define cmp(a,b) nod[a].frecv<nod[b].frecv
using namespace std;
struct arbore{int fiu[2];
long long frecv;
}nod[2*NMAx];
int n,LG[NMAx],Q[2][NMAx],L[2],R[2];
long long sol,B[NMAx];
void dfs(int i,long long config,int nivel) {
if(nod[i].fiu[0]) {
dfs(nod[i].fiu[0],(config<<1),nivel+1);
dfs(nod[i].fiu[1],(config<<1)+1,nivel+1);
return;
}
B[i]=config;
LG[i]=nivel;
}
void pop(int &x) {
if(cmp(Q[0][L[0]],Q[1][L[1]]))
x=Q[0][L[0]++];
else
x=Q[1][L[1]++];
}
void citire() {
int i;
ifstream in("huffman.in");
in>>n;
for(i=1;i<=n;i++) {
in>>nod[i].frecv;
Q[0][i]=i;
}
in.close();
}
void afis() {
int i;
ofstream out("huffman.out");
out<<sol<<'\n';
for(i=1;i<=n;i++)
out<<LG[i]<<' '<<B[i]<<'\n';
out.close();
}
int main() {
int a,b,nr;
citire();
L[0]=L[1]=1;
R[0]=n;
R[1]=0;
nr=n;
nod[0].frecv=oo*oo;
while(L[0]<=R[0]||L[1]<R[1]) {
pop(a);
pop(b);
++nr;
nod[nr].fiu[0]=a;
nod[nr].fiu[1]=b;
nod[nr].frecv=nod[a].frecv+nod[b].frecv;
sol+=nod[nr].frecv;
Q[1][++R[1]]=nr;
}
dfs(nr,0,0);
afis();
return 0;
}