Cod sursa(job #1221456)

Utilizator crucerucalinCalin-Cristian Cruceru crucerucalin Data 20 august 2014 15:12:03
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.41 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 *size;
};

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

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);

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

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;

        int p, q;
        in >> p >> q;
        --p;
        --q;

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

    delete disjoint;
    return 0;
}