Pagini recente » Cod sursa (job #2268057) | Cod sursa (job #2194523) | Cod sursa (job #2392500) | Cod sursa (job #280916) | Cod sursa (job #1000832)
#include <cstdio>
#include <queue>
#define maxn 1000100
struct Node
{
long long freq;
int l, r;
};
long long myP[maxn][2], nr;
Node myV[2 * maxn];
std::queue<int> A, B;
int nV;
int extract();
void dfs(int nod, int s, long long d);
int main()
{
freopen("huffman.in", "r", stdin);
freopen("huffman.out", "w", stdout);
scanf("%d", &nV);
for(int i = 0; i < nV; i++)
scanf("%lld", &myV[i].freq), A.push(i);
int c = nV;
int a, b;
while(true)
{
a = extract();
b = extract();
if(b == -1)
break;
else
{
myV[c].freq = myV[a].freq + myV[b].freq;
myV[c].l = a;
myV[c].r = b;
B.push(c);
c++;
}
}
nr = 0;
dfs(a, 0, 0);
printf("%lld\n", nr);
for(int i = 0; i < nV; i++)
printf("%lld %lld\n", myP[i][0], myP[i][1]);
return 0;
}
void dfs(int nod, int s, long long d)
{
if(nod < nV)
{
myP[nod][0] = s;
myP[nod][1] = d;
}
else
{
nr += myV[nod].freq;
dfs(myV[nod].l, s + 1, d << 1);
dfs(myV[nod].r, s + 1, (d << 1) + 1);
}
}
int extract()
{
int a = 0;
if(A.empty() && B.empty())
return -1;
else if(A.empty())
{
a = B.front();
B.pop();
return a;
}
else if(B.empty())
{
a = A.front();
A.pop();
return a;
}
else if(myV[A.front()].freq < myV[B.front()].freq)
{
a = A.front();
A.pop();
return a;
}
else
{
a = B.front();
B.pop();
return a;
}
}