Cod sursa(job #1699652)

Utilizator al.mocanuAlexandru Mocanu al.mocanu Data 8 mai 2016 09:25:21
Problema Paduri de multimi disjuncte Scor 80
Compilator c Status done
Runda Arhiva educationala Marime 0.71 kb
#include <stdio.h>
#define MAX 100005

int n, m, set[MAX], size[MAX], t, x, y;

void makeSet(int n){
	for(int i = 1; i <= n; i++){
		set[i] = i;
		size[i] = 1;
	}
}

int root(int x){
	int r = x, aux;
	while(r != set[r])
		r = set[r];
	while(x != r){
		aux = set[x];
		set[x] = r;
		x = aux;
	}
	return r;
}

void merge(int x, int y){
	if(size[x] < size[y])
		set[x] = y;
	else{
		set[y] = x;
		if(size[x] == size[y])
			size[x]++;
	}
}

int main(){
	freopen("disjoint.in", "r", stdin);
	freopen("disjoint.out", "w", stdout);
	scanf("%d%d", &n, &m);
	makeSet(n);
	for(int i = 0; i < m; i++){
		scanf("%d%d%d", &t, &x, &y);
		if(t == 1)
			merge(root(x), root(y));
		else
			printf(set[x] == set[y] ? "DA\n" : "NU\n");
	}
	return 0;
}