Pagini recente » Cod sursa (job #3031446) | Cod sursa (job #1130268) | Cod sursa (job #1040733) | Cod sursa (job #2074026) | Cod sursa (job #848947)
Cod sursa(job #848947)
#include <fstream>
#define Nmax 1000002
#define oo 1LL*(1<<30)
#define ll long long
#define MaxS (Nmax*10)
using namespace std;
struct arbore
{int fiu[2]; ll frecv;} nod[2*Nmax];
int n, nr, LG[Nmax], Q[2][Nmax], L[2], R[2];
ll sol,B[Nmax];
char S[MaxS];
void dfs(int i, ll 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(nod[Q[0][L[0]]].frecv<nod[Q[1][L[1]]].frecv)
x=Q[0][L[0]++]; else x=Q[1][L[1]++];
}
void citire()
{ ifstream f("huffman.in");
f>>n;
f.getline(S,MaxS,EOF);
for(int i=0;S[i];i++)
if(isdigit(S[i]))
{ for(++nr;isdigit(S[i]);nod[nr].frecv = nod[nr].frecv*10+S[i++]-'0');
Q[0][nr]=nr;
}
}
//for(int i=1; i<=n; i++) {in>>nod[i].frecv; Q[0][i]=i;}
void afis()
{ freopen("huffman.out","w",stdout);
printf("%lld\n",sol);
for(int i=1; i<=n; i++)
printf("%d %lld\n",LG[i],B[i]);
}
int main()
{ int a,b;
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;
}
/*
void citire(void)
{
int nr = 0;
f >> N;
f.getline(S,MaxS,EOF);
for(int i=0;S[i];i++)
if(isdigit(S[i]))
for(++nr;isdigit(S[i]);A[nr].info = A[nr].info*10+S[i++]-'0');
}
*/