Cod sursa(job #1973768)

Utilizator MaligMamaliga cu smantana Malig Data 25 aprilie 2017 21:02:11
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.11 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <string.h>

using namespace std;
ifstream in("disjoint.in");
ofstream out("disjoint.out");

#define pb push_back
typedef long long ll;
const int NMax = 1e5 + 5;
const int inf = 1e9 + 5;

int N,M;
int dad[NMax],nr[NMax];

void unite(int,int);
int findRoot(int);

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

    for (int i=1;i<=N;++i) {
        dad[i] = i;
        nr[i] = 1;
    }

    while (M--) {
        int tip,x,y;
        in>>tip>>x>>y;
        if (tip == 1) {
            unite(x,y);
        }
        else {
            out<<((findRoot(x) == findRoot(y)) ? "DA\n" : "NU\n");
        }
    }

    in.close();out.close();
    return 0;
}

int findRoot(int nod) {
    if (dad[nod] == nod) {
        return nod;
    }

    dad[nod] = findRoot(dad[nod]);
    return dad[nod];
}

void unite(int x,int y) {
    int rt1 = findRoot(x),
        rt2 = findRoot(y);
    if (nr[rt1] > nr[rt2]) {
        nr[rt1] += nr[rt2];

        dad[rt2] = rt1;
    }
    else {
        nr[rt2] += nr[rt1];

        dad[rt1] = rt2;
    }
}