Pagini recente » Cod sursa (job #2811413) | Cod sursa (job #1384109) | Cod sursa (job #1370327) | Cod sursa (job #2919066) | Cod sursa (job #534105)
Cod sursa(job #534105)
#include <fstream>
#include <queue>
#define MAXN 1000003
using namespace std;
queue< pair<long long,int> >q1,q2;
pair<long long, int>x,y,s;
int n,k,i,l[MAXN];
long long b[MAXN],total;
typedef struct{
int fd,fs;
long long v;
}elem;
elem nod[2*MAXN];
void build(){
k=n;
while(q1.size()+q2.size()>=2)
{
++k;
if(!q1.empty() and !q2.empty())
{
x=q1.front();
y=q2.front();
if(y.first<x.first) s=y; else s=x;
nod[k].v+=s.first;
nod[k].fs=s.second;
if(s==x) q1.pop(); else q2.pop();
if(!q1.empty() and !q2.empty()){
x=q1.front();
y=q2.front();
if(y.first<x.first) s=y; else s=x;
nod[k].v+=s.first;
nod[k].fd=s.second;
if(s==x) q1.pop(); else q2.pop();
}
else if(!q1.empty())
{
x=q1.front();
nod[k].v+=x.first;
nod[k].fd=x.second; q1.pop();
} else
if(!q2.empty())
{
x=q2.front();
nod[k].v+=x.first;
nod[k].fd=x.second; q2.pop();
}
}
else
if(!q1.empty())
{
x=q1.front();
nod[k].v+=x.first;
nod[k].fs=x.second; q1.pop();
x=q1.front();
nod[k].v+=x.first;
nod[k].fd=x.second; q1.pop();
} else
if(!q2.empty())
{
x=q2.front();
nod[k].v+=x.first;
nod[k].fs=x.second; q2.pop();
x=q2.front();
nod[k].v+=x.first;
nod[k].fd=x.second; q2.pop();
}
total+=nod[k].v;
q2.push(make_pair(nod[k].v,k));
}
}
void walk(int poz,int cod,int nivel){
if(nod[poz].fs){
walk(nod[poz].fs,cod*2,nivel+1);
walk(nod[poz].fd,cod*2+1,nivel+1);
} else
{
b[poz]=cod; l[poz]=nivel;
}
}
int main()
{
ifstream fi("huffman.in");
ofstream fo("huffman.out");
fi>>n;
for(i=1;i<=n;i++)
{
fi>>nod[i].v;
q1.push(make_pair(nod[i].v,i));
}
build();
walk(k,0,0);
fo<<total<<"\n";
for(i=1;i<=n;i++)
fo<<l[i]<<" "<<b[i]<<"\n";
return 0;
}