Cod sursa(job #656763)

Utilizator Bogdan_tmmTirca Bogdan Bogdan_tmm Data 5 ianuarie 2012 10:31:10
Problema Paduri de multimi disjuncte Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 0.87 kb
#include <algorithm>
#include <stdio.h>

using namespace std;

#define N_MAX 100001

int tata[N_MAX], grad[N_MAX];

int op, x, y;
int n, m;

int radacina(int x){
	int rad, aux;
	for(rad = x; rad != tata[rad]; rad = tata[rad]);
	
	for(; x != tata[x];){
		aux = tata[x];
		tata[x] = rad;
		x = aux;
	}
}

void uneste(int x, int y){
	if(grad[x] > grad[y]){
		tata[y] = tata[x];
		grad[x] += grad[y];
	}
	else{
		tata[x] = tata[y];
		grad[y] += grad[x];
	}
}

int main(){
	freopen("disjoint.in", "r", stdin);
	freopen("disjoint.out", "w", stdout);
	
	scanf("%d %d", &n, &m);
	for(int i = 1; i <= n; i ++)
		tata[i] = i, grad[i] = 1;
	
	for(int i = 0; i < m; i ++){
		scanf("%d %d %d", &op, &x, &y);
		if(op == 1)
			uneste(x, y);
		else
			if(radacina(x) == radacina(y))
				printf("DA\n");
			else
				printf("NU\n");
	}
	
	
	return 0;
}