Pagini recente » Cod sursa (job #31135) | Cod sursa (job #2721927) | Cod sursa (job #2975660) | Cod sursa (job #995900) | Cod sursa (job #3135867)
#include <fstream>
#define NMAX 10000001
#define INF 1LL * 1000000000 * 1000000000
using namespace std;
ifstream fin("huffman.in");
ofstream fout("huffman.out");
struct Nod{
long long fr;
int fiu[2];
} nod[2*NMAX];
int n, lg[2*NMAX];
long long total, b[2*NMAX];
bool used[2*NMAX];
void dfs(int poz, long long cod, int nivel){
if(nod[poz].fiu[0]){
dfs(nod[poz].fiu[0], cod*2, nivel+1);
dfs(nod[poz].fiu[1], cod*2+1, nivel+1);
return;
}
lg[poz] = nivel;
b[poz] = cod;
}
void solve(){
int nc = n;
for(int l = 1; l <= n - 1; l++){
nc++;
for(int i = 0; i < 2; i++){
int pozMin = 0;
long long mn = INF;
for(int j = 1; j < nc; j++){
if(nod[j].fr < mn && !used[j]){
pozMin = j;
mn = nod[j].fr;
}
}
used[pozMin] = true;
nod[nc].fiu[i] = pozMin;
nod[nc].fr += nod[pozMin].fr;
}
total += nod[nc].fr;
}
dfs(nc, 0, 0);
}
int main()
{
fin >> n;
for(int i = 1; i <= n; i++)
fin >> nod[i].fr;
solve();
fout << total << '\n';
for(int i = 1; i <= n; i++)
fout << lg[i] << ' ' << b[i] << '\n';
return 0;
}