Pagini recente » Cod sursa (job #2514823) | Cod sursa (job #518699) | Cod sursa (job #3273068) | Cod sursa (job #41810) | Cod sursa (job #2925556)
#include <fstream>
#include<queue>
using namespace std;
ifstream in("huffman.in");
ofstream out("huffman.out");
struct tree{
int son1, son2;
long long weight;
};
struct cod{
int lung;
long long cod;
};
const int nmax = 1000006;
long long lg;
int n, startv, new_nod, mini[2];
queue<int> coada;
tree arbore[4* nmax];
cod vans[nmax];
void find_ans(long long cod, int lung, int ind)
{
if(ind<=n)
{
vans[ind].cod = cod;
vans[ind].lung = lung;
return;
}
find_ans(cod * 2, lung + 1, arbore[ind].son1);
find_ans(cod * 2 + 1, lung + 1, arbore[ind].son2);
}
int main()
{
in>>n;
for(int i = 1; i<=n; i++)
{
in>>arbore[i].weight;
arbore[i].son1 = arbore[i].son2 = -1;
}
startv = 1, new_nod = n + 1;
while(startv<=n || (int)coada.size()>1)
{
for(int i = 0 ;i<2; i++)
{
if(startv<=n && ((int)coada.empty()==1 || arbore[startv].weight<=arbore[(int)coada.front()].weight))
{
mini[i] = startv;
startv++;
continue;
}
if((int)coada.empty()==0 && (startv>n || arbore[startv].weight>=arbore[(int)coada.front()].weight))
{
mini[i] = (int)coada.front();
coada.pop();
}
}
arbore[new_nod].son1 = mini[0];
arbore[new_nod].son2 = mini[1];
arbore[new_nod].weight = arbore[mini[0]].weight + arbore[mini[1]].weight;
coada.push(new_nod);
new_nod++;
}
/*for(int i = 1; i<new_nod; i++)
{
out<<i<<' '<<arbore[i].son1<<' '<<arbore[i].son2<<' '<<arbore[i].weight<<'\n';
}*/
find_ans(0, 0, new_nod - 1);
for(int i = 1; i<=n; i++)
{
lg += vans[i].lung * arbore[i].weight;
}
out<<lg<<'\n';
for(int i = 1; i<=n; i++)
{
out<<vans[i].lung<<' '<<vans[i].cod<<'\n';
}
return 0;
}