Cod sursa(job #2750282)

Utilizator muiepulicimatacutactu muiepulici Data 10 mai 2021 17:13:07
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.88 kb
#include <fstream>

int t[100001];
int rang[100001];

int GetRoot(int k) {
	if (t[k] == k)
		return k;

	int root = GetRoot(t[k]);
	t[k] = root;
	return root;
}

bool SameRoot(int x, int y) {
	return GetRoot(x) == GetRoot(y);
}

void Unite(int x, int y) {
	int rx = GetRoot(x);
	int ry = GetRoot(y);

	if (rx == ry)
		return;

	if (rang[rx] > rang[ry])
		t[ry] = rx;
	else {
		t[rx] = ry;

		if (rang[rx] == rang[ry])
			++rang[ry];
	}
}

int main() {
	std::ifstream fin("disjoint.in");
	std::ofstream fout("disjoint.out");

	int N, M;
	fin >> N >> M;

	for (int i = 1; i <= N; ++i)
		t[i] = i;

	int cod, x, y;

	while (M--) {
		fin >> cod >> x >> y;

		if (cod == 1) {
			Unite(x, y);
		} else if (cod == 2) {
			if (SameRoot(x, y))
				fout << "DA\n";
			else
				fout << "NU\n";
		}
	}

	fin.close();
	fout.close();

	return 0;
}