Pagini recente » Cod sursa (job #3160622) | Cod sursa (job #2552563) | Cod sursa (job #1310350) | Cod sursa (job #1621593) | Cod sursa (job #2889670)
#include <fstream>
#include <vector>
#include <iostream>
using namespace std;
ifstream fin("huffman.in");
ofstream fout("huffman.out");
vector <int> smb;
vector <pair<int,long long>> rez;
vecotr <pair<int,int>> fi;
int nrsmb, i, j, a, b, m;
long long suma;
void intrare(int rad, int biti, long long suma1)
{
if(rad < nrsmb)
{
rez[rad].first=biti;
rez[rad].second=suma1;
}
intrare(fi[rad].first, biti+1,suma1*2);
intrare(fi[rad].second,biti+1,suma1*2+1);
}
int main()
{
fin>>nrsmb;
pair <int,int> nul(0,0);
smb.assign(nrsmb*2,0);
rez.assign(nrsmb,nul);
fi.assign(nrsmb*2,nul);
for(i=0;i<nrsmb;i++)
fin>>smb[i];
smb[nrsmb]=smb[0]+smb[1];
fi[nrsmb]=make_pair(0,1);
k=0;
j=1;
for(i=2;i<nrsmb-1;i++)
{
a=smb[i];
if(smb[i+1] < smb[nrsmb+m])
{
b=smb[i];
smb[nrsmb+j]=a+b;
fi[nrsmb+j]=make_pair(i,nrsmb+m);
m++;
}
j++;
}
if(i==nrsmb-1)
{
a=smb[i];
b=smb[nrsmb+m];
smb[nrsmb+j]=a+b;
fi[nrsmb+j]=make_pair(i,nrmsb+m);
m++,j++;
}
while(j < nrsmb-1)
{
a=smb[nrsmb+m];
b=smb[nrsmb+m+1];
smb[nrsmb+j]=a+b;
fi[nrsmb+j]=make_pair(nrsmb+m,nrsmb+m+1);
m = m+2;j++;
}
for(i=nrsmb;i<nrsmb*2-1;i++)
{
suma = suma + smb[i];
}
intrare(nrsmb*2-2,0,0);
fout<<suma<<'\n';
for(i=0;i<nrsmb;i++)
fout<<rez[i].first<<' '<<rez[i].second<<'\n';
return 0;
}