Cod sursa(job #1158678)

Utilizator mvcl3Marian Iacob mvcl3 Data 28 martie 2014 23:42:10
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.19 kb
#include <fstream>

#define in "disjoint.in"
#define out "disjoint.out"
#define Max_Size 100009
#define YES "DA\n"
#define NOT "NU\n"

std :: ifstream f(in);
std :: ofstream g(out);

int N, M, P[Max_Size], Rank[Max_Size];

class DSU {
    public :
        void Init();
        int Find(int);
        void Union(int, int);
};

void DSU :: Init() {
    for(int i = 1; i <= N; ++i) P[i] = i;
}

int DSU :: Find(int node) {
    int Root, aux;

    for(Root = node; Root != P[Root]; Root = P[Root]);

    while(node != P[node]) {
        aux = P[node];
        P[node] = Root;
        node = aux;
    }
    return Root;
}

void DSU :: Union(int node, int node1) {
    if(Rank[node] < Rank[node1])   P[node] = node1;
    if(Rank[node] > Rank[node1])   P[node1] = node;

    if(Rank[node] == Rank[node1]) {
        ++Rank[node1];
        P[node1] = node;
    }
}

int main() {
    f >> N >> M;

    DSU obj;
    obj.Init();
    for(int t, x, y, i = 1; i <= M; ++i) {
        f >> t >> x >> y;

        if(t == 1)  obj.Union(obj.Find(x), obj.Find(y));
        else    {
            if(obj.Find(x) == obj.Find(y))  g << YES;
            else                            g << NOT;
        }
    }

    g.close();
    return 0;
}