Pagini recente » Cod sursa (job #241350) | Cod sursa (job #1056075) | Cod sursa (job #339724) | Cod sursa (job #2383640) | Cod sursa (job #2495640)
#include <fstream>
#include <vector>
using namespace std;
ifstream fin("huffman.in");
ofstream fout("huffman.out");
int n, m, i, j, v[100001], c[100001], nr[100001], w[100001], nrW, SOL;
vector<int> sol;
pair<int, pair<int, int> > H[100001];
void dfs(int nod, int cod, int niv){
c[nod] = cod;
nr[nod] = niv;
if(H[nod].first != 0){
for(int i = 0;i<2;i++){
if(i == 0){
int vecin = H[nod].second.first;
dfs(vecin, (cod<<1), niv+1);
if(H[vecin].first == 0){
SOL += nr[vecin]*v[vecin];
sol.push_back(vecin);
}
}
else{
int vecin = H[nod].second.second;
dfs(vecin, (cod<<1) + 1, niv+1);
if(H[vecin].first == 0){
SOL += nr[vecin]*v[vecin];
sol.push_back(vecin);
}
}
}
}
}
int main(){
fin>>n;
for(i=1;i<=n;i++){
fin>>v[i];
w[i] = 100000001;
}
i = j = 1;
m = n;
while(m < 2*n){
if(v[i] <= w[j] && i <= n && i+1 <=n && v[i+1] <= w[j]){
/// le iau pe primele doua primul sir
w[++nrW] = v[i]+v[i+1];
H[++m] = {w[nrW], {i, i+1}};
i += 2;
}
else
if((v[i] <= w[j] && i <= n && ( (i+1 <= n && v[i+1] > w[j]) || (i+1 > n) ))||(i <= n && v[i] > w[j] && ((j+1 < 2*n && w[j+1] > v[i])||(j+1 >= 2*n)))){ /// iau capetele celor doua siruri
w[++nrW] = v[i] + w[j];
H[++m] = {w[nrW], {i, j+n}};
i++, j++;
}
else
if(j+1 <= 2*n-1 && (i > n || (w[j] < v[i] && w[j+1] < v[i]))){
w[++nrW] = w[j] + w[j+1];
H[++m] = {w[nrW], {j+n, j+n+1}};
j += 2;
}
}
dfs(2*n-1, 0, 0);
fout<<SOL<<"\n";
for(i=0;i<sol.size();i++)
fout<<nr[sol[i]]<<" "<<c[sol[i]]<<"\n";
return 0;
}