Cod sursa(job #1824472)

Utilizator mdiannnaMarusic Diana mdiannna Data 7 decembrie 2016 21:16:56
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.05 kb
#include <iostream>
#include <stdio.h>

using namespace std;
int N, M;

int r[100001];
int dim[100001];

void init(){
    for(int i=1; i<=N; i++){
        r[i] = i;
        dim[i] = 1;
    }
}

int gaseste_radacina(int x){
    while(r[x] != x){
        x = r[x];
    }
    return x;
}

void join(int x, int y){
    x = gaseste_radacina(x);
    y = gaseste_radacina(y);

    if(dim[x] > dim[y])
        r[y] = x;
    else
        if(dim[y] > dim[x])
            r[x] = y;
        else
            if(dim[x] == dim[y]){
                r[x] = y;
                dim[y]++;
            }

}

void aceeasi_multime(int x, int y){
    if(gaseste_radacina(x) == gaseste_radacina(y))
        printf("DA\n");
    else
        printf("NU\n");
}

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

    int op, x, y;

    scanf("%d %d", &N, &M);
    init();
    for(int i=0; i<M; i++){
        scanf("%d %d %d", &op, &x, &y);
        if(op == 1)
            join(x, y);
        else
            aceeasi_multime(x, y);
    }

    return 0;
}