Cod sursa(job #1820479)

Utilizator StefansebiStefan Sebastian Stefansebi Data 1 decembrie 2016 19:48:52
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.86 kb
#include<fstream>
#include<map>
using namespace std;
ifstream fin("disjoint.in");
ofstream fout("disjoint.out");

int n, m;
int father[100001], rankEl[100001];

int findFather(int el) {
	if (el == father[el]) {
		return el;
	}
	father[el] = findFather(father[el]);
	return father[el];
}

void unionSet(int el1, int el2) {
	el1 = findFather(el1);
	el2 = findFather(el2);
	rankEl[el1] > rankEl[el2] ? father[el2] = el1 : father[el1] = el2;

	if (rankEl[el1] == rankEl[el2]) {
		rankEl[el2]++;
	}
}


int main() {
	int n, m;
	fin >> n >> m;

	for (int i = 1; i <= n; i++) {
		father[i] = i; rankEl[i] = 0;
	}
	for (int i = 1; i <= m; i++) {
		int a, b, c;
		fin >> a >> b >> c;
		if (a == 1) {
			unionSet(b, c);
		}
		else {
			if (findFather(b) == findFather(c)) {
				fout << "DA\n";
			}
			else {
				fout << "NU\n";
			}
		}
	}
}