Cod sursa(job #2000409)

Utilizator contnouAndrei Pavel contnou Data 13 iulie 2017 16:04:17
Problema Paduri de multimi disjuncte Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.04 kb
#include <fstream>
#include <iostream>
#define MAXSZ 100005

using namespace std;

ifstream f("disjoint.in");
ofstream g("disjoint.out");

int n, T[MAXSZ], m;
int sz[MAXSZ];

int findSet(int x) {
	//
	if (T[x] == x) return x;

	T[x] = findSet(T[x]);	
	return T[x];
}

void join(int x, int y) {
	//
	int set1 = findSet(x);
	int set2 = findSet(y);
	if (set1 != set2) {
		if (sz[set1] < sz[set2]) {
			T[set1] = set2;
		}
		else {
			T[set2] = set1;

		}
		int aux = sz[set1];
		sz[set1] += sz[set2];
		sz[set2] += aux;
	}
}

bool checkSameSet(int x, int y) {
	//
	int set1 = findSet(x);
	int set2 = findSet(y);
	return (set1 == set2);
}

void init(int n) {
	//
	for (int i = 1; i <= n; i++) {
		T[i] = i;
		sz[i] = 1;
	}
}
int main() {
	//
	f >> n >> m;
	init(n);
	for (int i = 1; i <= m; i++) {
		//
		int op, x, y;
		f >> op >> x >> y;
		switch (op) {
			case 1:
				join(x, y);
				break;
			case 2:
				bool same = checkSameSet(x, y);
				g << (same ? "DA" : "NU") << endl;
				break;
		}
	}
}