Cod sursa(job #1607771)

Utilizator TopiAlexTopala Alexandru TopiAlex Data 21 februarie 2016 16:29:58
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.21 kb
#include <stdio.h>
#define N_MAX 100003
#define UNIRE 1
#define COMPARA 2

int n, m;
int tata[N_MAX];
int h[N_MAX];

bool unire(int, int, int);
int findDad(int);

int main()
{
    freopen("disjoint.in", "r", stdin);
    freopen("disjoint.out", "w", stdout);
    int c, x, y;
    bool rez;

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

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

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


    return 0;
}

bool unire(int x, int y, int c){
    int a = findDad(x);
    int b = findDad(y);

    if (a == b)
        return true;
    else {
        if (c == COMPARA) return false;
        if (h[a] > h[b]) tata[b] = a;
        else if (h[a] < h[b]) tata[a] = b;
        else tata[a] = b, h[a]++;
    }
    return true;
}

int findDad(int x){
    int r;
    if (tata[x] != x){
        r = findDad(tata[x]);
        tata[x] = r;
    }
    return tata[x];
}