Pagini recente » Cod sursa (job #529657) | Cod sursa (job #349452) | Cod sursa (job #2596108) | Cod sursa (job #2312682) | Cod sursa (job #1000820)
#include <fstream>
#include <queue>
#define maxn 1000100
struct Node
{
long long freq;
int l, r;
};
long long myP[maxn][2];
Node myV[2 * maxn];
std::queue<int> A, B;
int extract();
void dfs(int nod, long long &sum, int s, long long d);
int main()
{
std::ifstream in("huffman.in");
std::ofstream out("huffman.out");
int nV;
long long nr;
in >> nV;
for(int i = 0; i < nV; i++)
in >> nr, A.push(i), myV[i].freq = nr, myV[i].l = -1, myV[i].r = -1;
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, nr, 0, 0);
out << nr << '\n';
for(int i = 0; i < nV; i++)
out << myP[i][0] << ' ' << myP[i][1] << '\n';
return 0;
}
void dfs(int nod, long long &sum, int s, long long d)
{
if(myV[nod].l == myV[nod].r)
{
myP[nod][0] = s;
myP[nod][1] = d;
}
else
{
sum += myV[nod].freq;
dfs(myV[nod].l, sum, s + 1, d << 1);
dfs(myV[nod].r, sum, 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;
}
}