Cod sursa(job #1000770)

Utilizator cosmo0093Raduta Cosmin cosmo0093 Data 23 septembrie 2013 18:44:00
Problema Coduri Huffman Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 2.06 kb
#include <fstream>
#include <queue>


struct Node
{
    int nr;
    int place;
    Node *left, *right;

    Node() : nr(), left(NULL), right(NULL) {}
    Node(int a, int b) : nr(a), place(b), left(NULL), right() {}
    Node(Node *a, Node *b) : nr(a->nr + b-> nr), 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, 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, i));
    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;
    Pair *myP = new Pair[nV];
    dfs(a, nr, myP, 0, 0);

    out << nr << '\n';

    for(unsigned i = 0; i < nV; 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, Pair *myP, long long a, long long b)
{
    if(A->left != NULL && A->right != NULL)
    {
        nr += A->nr;
        dfs(A->left, nr, myP, a + 1, b << 1);
        dfs(A->right, nr, myP, a + 1, (b << 1) + 1);
    }
    else myP[A->place] = Pair(a, b);
    return;
}