Cod sursa(job #1756766)

Utilizator theodor.moroianuTheodor Moroianu theodor.moroianu Data 13 septembrie 2016 17:03:07
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.83 kb
#include <fstream>
using namespace std;

int tata[100010];
int s[100010];

int gaseste(int x);
bool gaseste(int a, int b);
void uneste(int a, int b);

int main()
{
	for (int i = 1; i <= 100000; i++)
		tata[i] = i, s[i] = 1;

	ifstream in("disjoint.in");
	ofstream out("disjoint.out");
	int n, op, a, b;
	in >> op >> n;
	while (n--) {
		in >> op >> a >> b;
		if (op == 1)
			uneste(a, b);
		else
			out << (gaseste(a, b) ? "DA\n" : "NU\n");
	}
	return 0;
}

int gaseste(int x)
{
	if (tata[x] != x)
		tata[x] = gaseste(tata[x]);
	return tata[x];
}

bool gaseste(int a, int b)
{
	a = gaseste(a);
	b = gaseste(b);
	return (a == b);
}

void uneste(int a, int b)
{
	a = gaseste(a);
	b = gaseste(b);
	if (s[a] > s[b]) {
		s[a] += s[b];
		tata[b] = a;
	}
	else {
		s[b] += s[a];
		tata[a] = b;
	}
}