Cod sursa(job #1449554)

Utilizator timicsIoana Tamas timics Data 9 iunie 2015 23:27:30
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.02 kb
#include<stdio.h>
int parent[100100],nr[100100];
int N,M,x,y,z;
 
int root(int k) {
    int ret = k;
    while(parent[ret]!=ret) {
        ret=parent[ret];
    }
    int curr = k;
    while(parent[curr]!=curr) {
        int temp = parent[curr];
        parent[curr] = ret;
        curr = temp;
    }
    return ret;
}

void connect(int y, int z) {
    int d = root(y);
    int e = root(z);
    if(nr[d] < nr[e]) {
        parent[d] = e; 
        nr[e] += nr[d];
    } else {
        parent[e] = d;
        nr[d] += nr[e];
    }
}
 
int main() {
    freopen("disjoint.in","r",stdin);
    freopen("disjoint.out","w",stdout);
    scanf("%d%d",&N,&M);
    for(int i=1;i<=N;++i) {
        parent[i] = i;
        nr[i] = 1;
    } 
    for(int i=1;i<=M;++i) {
        scanf("%d%d%d",&x,&y,&z);
        if(x==2) {
            if(root(y) == root(z)) {
               printf("DA\n");
            }
            else {
                printf("NU\n");
            }
        }
        if(x==1) {
            connect(y,z);
        }
    }
    return 0;
 
}