Cod sursa(job #531346)

Utilizator Gaby_mMititelu Gabriel Gaby_m Data 9 februarie 2011 15:09:03
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.25 kb
#include<cstdio>
#include<vector>
using namespace std;
#define NMAX 100001
pair<int, int> sets[NMAX];
int N;

void initSets() {
	for(int i = 1; i <= N; i++) {
		pair <int, int> p;
		p.first = 0;
		p.second = 1;
		sets[i] = p;
	}
}

int getFather (int x) {
	while (sets[x].first != 0) {
		x = sets[x].first;
	}
	return x;
}

void updateFather(int x, int father) {
	while (sets[x].first != 0) {
		sets[x].first = father;
		x = sets[x].first;		
	}
}

void merge(int x, int y) {	
	int a = getFather(x);
	updateFather(x, a);

	int b = getFather(y);
	updateFather(y, b);

	if (sets[a].second > sets[b].second) {
		sets[b].first = a;
		sets[a].second += sets[b].second;
	}
	else {
		sets[a].first = b;
		sets[b].second += sets[a].second;
	}
}



void check(int a, int b) {
	int fa, fb;
	fa = getFather(a);
	updateFather(a, fa);

	fb = getFather(b);
	updateFather(b, fb);

	if (fa == fb) printf("DA\n");
	else printf("NU\n");
}
int main() {
	freopen("disjoint.in", "r", stdin);
	freopen("disjoint.out", "w", stdout);
	
	int M;

	scanf("%d %d", &N, &M);

	initSets();
	int op, a, b;
	for (int i = 0; i < M; i++) {
		scanf("%d %d %d", &op, &a, &b);
		if (op == 1) merge(a, b);
		else check(a, b);
	}
	return 0;
}