Pagini recente » Cod sursa (job #3269503) | Cod sursa (job #1424605) | Cod sursa (job #2456260) | Cod sursa (job #2911164) | Cod sursa (job #1138920)
#include<fstream>
#include<queue>
using namespace std;
int n,s[2][100001],m;
struct nod
{
int fr,f1,f2;
}v[1000001];
long long sol;
queue<int> q1,q2;
ifstream fin("huffman.in");
ofstream fout("huffman.out");
void citire()
{
fin>>n;
m=n;
for(int i=1;i<=n;i++)
{
fin>>v[i].fr;
q1.push(i);
}
}
void huffman()
{
int nod1=0,nod2=0;
while(!q1.empty() || q2.size()>1)
{
if(!q1.empty() && !q2.empty())
{
if(v[q1.front()].fr<v[q2.front()].fr)
{
nod1=q1.front();
q1.pop();
}
else
{
nod1=q2.front();
q2.pop();
}
if(v[q1.front()].fr<v[q2.front()].fr)
{
nod2=q1.front();
q1.pop();
}
else
{
nod2=q2.front();
q2.pop();
}
}
else
if(q1.size()>1)
{
nod1=q1.front(); q1.pop();
nod2=q1.front(); q1.pop();
}
else
if(q2.size()>1)
{
nod1=q2.front(); q2.pop();
nod2=q2.front(); q2.pop();
}
else
break;
v[++n].fr=v[nod1].fr+v[nod2].fr;
v[n].f1=nod1;
v[n].f2=nod2;
q2.push(n);
}
}
void dfs(int ind,int cod, long long lg)
{
if(v[ind].f1!=0)
{
sol+=v[ind].fr;
dfs(v[ind].f1,(cod<<1),lg+1);
dfs(v[ind].f2,(cod<<1)+1,lg+1);
}
else
{
s[0][ind]=lg;
s[1][ind]=cod;
}
}
int main()
{
citire();
huffman();
dfs(n,0,0);
fout<<sol<<"\n";
for(int i=1;i<=m;i++)
{
fout<<s[0][i]<<" "<<s[1][i]<<"\n";
}
return 0;
}