Cod sursa(job #1221447)

Utilizator crucerucalinCalin-Cristian Cruceru crucerucalin Data 20 august 2014 15:03:39
Problema Paduri de multimi disjuncte Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.58 kb
#include <fstream>
#include <cassert>

class WQUPC
{
public:
    WQUPC(int n);
    ~WQUPC();

    bool areConnected(int p, int q);
    void connect(int p, int q);

private:
    int root(int i);

    int *id;
    int *rank;
};

WQUPC::WQUPC(int n) :
    id(new int[n]),
    rank(new int[n])
{
    for (int i = 0; i < n; ++i) {
        id[i] = i;
        rank[i] = 0;
    }
}

WQUPC::~WQUPC()
{
    // nothing to do
}

int WQUPC::root(int i)
{
    // Apply path compression.
    if (i != id[i])
        id[i] = root(id[i]);

    return id[i];
}

bool WQUPC::areConnected(int p, int q)
{
    return root(p) == root(q);
}

void WQUPC::connect(int p, int q)
{
    int rootP = root(p);
    int rootQ = root(q);

    if (rootP == rootQ)
        return;

    // Apply weighting.
    if (rank[rootP] < rank[rootQ]) {
        id[rootP] = rootQ;
    } else if (rank[rootP] > rank[rootQ]) {
        id[rootQ] = rootP;
    } else {
        id[rootQ] = rootP;
        rank[rootP] += 1;
    }
}

int main()
{
    std::ifstream in("disjoint.in");
    std::ofstream out("disjoint.out");

    int N, M;
    in >> N >> M;
    WQUPC *disjoint = new WQUPC(N);

    for (int i = 0; i < M; ++i) {
        int code;
        in >> code;
        assert(code == 1 || code == 2);

        int p, q;
        in >> p >> q;
        --p;
        --q;
        assert(0 <= p < N && 0 <= q < N);

        if (code == 1)
            disjoint->connect(p, q);
        else
            disjoint->areConnected(p, q) ? out << "DA" << std::endl :
                                           out << "NU" << std::endl;
    }

    delete disjoint;
    return 0;
}