Cod sursa(job #531327)

Utilizator Gaby_mMititelu Gabriel Gaby_m Data 9 februarie 2011 14:33:23
Problema Paduri de multimi disjuncte Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.19 kb
#include<cstdio>
#include<vector>
using namespace std;
#define NMAX 100001;
vector<pair<int, int> > sets;
int N;

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

void merge(int a, int 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;
	}
}


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 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;
}