Pagini recente » Cod sursa (job #804797) | Cod sursa (job #812941) | Cod sursa (job #1111461) | Cod sursa (job #662453) | Cod sursa (job #1146235)
#include<fstream>
#include<iostream>
#define Maxn 1000100
#define INF 1LL*Maxn*Maxn
using namespace std;
struct nod {long long valoare;int fii[2];}Nod[2*Maxn];
int N,l[2],r[2],NrNod;
int q[2][Maxn], lg[Maxn];
long long b[Maxn], m, sol;
void citire() {
ifstream in("huffman.in");
int i;
in>>N;
for(i=1;i<=N;i++) {
in>>Nod[i].valoare;
q[0][i]=i;
}
in.close();
}
void dfs(int poz, long long cod, int nivel)
{
if(Nod[poz].fii[0]) {
dfs(Nod[poz].fii[0], cod*2, nivel+1);
dfs(Nod[poz].fii[1], cod*2+1, nivel+1);
return;
}
lg[poz]=nivel;
b[poz]=cod;
}
void solve() {
int fiu1,fiu2;
NrNod=N;
l[0]=1;
l[1]=1;
r[0]=N;
Nod[0].valoare=INF;
while(l[0]<=r[0]||l[1]<r[1]) {
if(Nod[q[0][l[0]]].valoare<Nod[q[1][l[1]]].valoare)
fiu1=q[0][l[0]++];
else
fiu1=q[1][l[1]++];
if(Nod[q[0][l[0]]].valoare<Nod[q[1][l[1]]].valoare)
fiu2=q[0][l[0]++];
else
fiu2=q[1][l[1]++];
cout<<fiu1<<' '<<fiu2<<'\n';
NrNod++;
Nod[NrNod].fii[0]=fiu1;
Nod[NrNod].fii[1]=fiu2;
Nod[NrNod].valoare=Nod[fiu1].valoare+Nod[fiu2].valoare;
sol+=Nod[NrNod].valoare;
r[1]++;
q[1][r[1]]=NrNod;
}
dfs(NrNod,0,0);
}
void afisare() {
ofstream out("huffman.out");
int i;
out<<sol<<'\n';
for(i=1;i<=N;i++)
out<<lg[i]<<' '<<b[i]<<'\n';
out.close();
}
int main() {
citire();
solve();
afisare();
return 0;
}