Cod sursa(job #1814920)

Utilizator TopiAlexTopala Alexandru TopiAlex Data 24 noiembrie 2016 17:50:29
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.49 kb
#include <cstdio>
#define N_MAX 100002
#define UNION 1
#define COMPARE 2
using namespace std;

int n;
int T;

int tata[N_MAX];
int h[N_MAX];

inline void unire(int, int);
inline int findDaddy(int);
inline bool isAsociated(int, int);

int main()
{
    freopen("disjoint.in", "r", stdin);
    freopen("disjoint.out", "w", stdout);

    int c, x, y;

    scanf("%d%d", &n, &T);

    for (int i = 1; i <= n; ++i) {
        tata[i] = i;
    }

    for (int i = 1; i <= T; ++i) {
        scanf("%d%d%d", &c, &x, &y);
        switch (c) {
        case UNION :
            unire(x, y);
            break;
        case COMPARE :
            if (isAsociated(x, y)) {
                printf("DA\n");
            } else {
                printf("NU\n");
            }
            break;
        }
    }

    return 0;
}

inline void unire(int x, int y) {
    int tataX = findDaddy(x);
    int tataY = findDaddy(y);

    if (tataX != tataY) {
        if (h[tataX] > h[tataY]) {
            tata[tataY] = tataX;
        } else if (h[tataX] < h[tataY]) {
            tata[tataX] = tataY;
        } else {
            tata[tataY] = tataX;
            h[tataX]++;
        }
    }
}

inline int findDaddy(int x) {
    int t = x;
    if (tata[x] != x) {
        t = findDaddy(tata[x]);
        tata[x] = t;
    }
    return t;
}

inline bool isAsociated(int x, int y) {
    int tataX = findDaddy(x);
    int tataY = findDaddy(y);

    return (tataX == tataY);

}