Cod sursa(job #1000735)

Utilizator cosmo0093Raduta Cosmin cosmo0093 Data 23 septembrie 2013 17:57:20
Problema Coduri Huffman Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 2.08 kb
#include <fstream>
#include <queue>


struct Node
{
    long long nr;
    bool c;
    Node *left, *right;

    Node() : nr(), c(false), left(NULL), right(NULL) {}
    Node(long long a) : nr(a), c(true), left(NULL), right() {}
    Node(Node *a, Node *b) : nr(a->nr + b-> nr), c(false), left(a), right(b) {}
};

struct Pair
{
    long long a, b;
    Pair() : a(), b() {}
    Pair(long long c, long long d) : a(c), b(d) {}
};


Node* extract(std::queue<Node*> &A, std::queue<Node*> &B);
void dfs(Node *A, long long &nr, std::vector<Pair> &myP, long long a, long long b);


int main()
{
    std::ifstream in("huffman.in");
    std::ofstream out("huffman.out");
    int nV;
    long long nr;
    std::queue<Node*> myQ1, myQ2;
    in >> nV;
    for(int i = 0; i < nV; i++)
        in >> nr, myQ1.push(new Node(nr));
    Node *a = NULL, *b = NULL;
    while(true)
    {
        a = extract(myQ1, myQ2);
        b = extract(myQ1, myQ2);
        if(b == NULL) break;
        else myQ2.push(new Node(a, b));
    }

    nr = 0;
    std::vector<Pair> myP;
    dfs(a, nr, myP, 0, 0);

    out << nr << '\n';

    for(unsigned i = 0; i < myP.size(); i++)
        out << myP[i].a << ' ' << myP[i].b << '\n';

    return 0;
}

Node* extract(std::queue<Node*> &A, std::queue<Node*> &B)
{
    Node *c = NULL;
    if(A.empty() && B.empty())
        return c;
    else if(A.empty() && !B.empty())
    {
        c = B.front();
        B.pop();
    }
    else if(!A.empty() && B.empty())
    {
        c = A.front();
        A.pop();
    }
    else
    {
        if(A.front()->nr < B.front()->nr)
        {
            c = A.front();
            A.pop();
        }
        else
        {
            c = B.front();
            B.pop();
        }
    }
    return c;
}

void dfs(Node *A, long long &nr, std::vector<Pair> &myP, long long a, long long b)
{
    if(!A->c)
    {
        nr += A->nr;
        dfs(A->left, nr, myP, a + 1, b * 2 + 0);
        dfs(A->right, nr, myP, a + 1, b * 2 + 1);
    }
    else myP.push_back(Pair(a, b));
    return;
}