Cod sursa(job #2917481)

Utilizator livliviLivia Magureanu livlivi Data 5 august 2022 13:05:17
Problema Paduri de multimi disjuncte Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.94 kb
// #include <iostream>
#include <fstream>
#include <vector>

using namespace std;

ifstream cin("disjoint.in");
ofstream cout("disjoint.out");

class DisjointSet {
public:
	DisjointSet(int size) {
		padre.resize(size + 1);
		set_size.resize(size + 1, 1);
	}

	void join(int x, int y) {
		x = rad(x);
		y = rad(y);
		if (x == y) { continue; }

		if (set_size[x] > set_size[y]) {
			swap(x, y);
		}

		padre[x] = y;
		set_size[y] += set_size[x];
	}

	bool sameSet(int x, int y) {
		return (rad(x) == rad(y));
	}

private:
	vector<int> padre;
	vector<int> set_size;

	int rad(int x) {
		if (padre[x] == 0) {
			return x;
		} else {
			padre[x] = rad(padre[x]);
			return padre[x];
		}
	}
};

int main() {
	int n, m; cin >> n >> m;
	DisjointSet padure(n);

	for (int i = 0; i < m; i++) {
		int op, x, y; cin >> op >> x >> y;
		if (op == 1) {
			padure.join(x, y);
		} else if (padure.sameSet(x, y)) {
			cout << "DA\n";
		} else {
			cout << "NU\n";
		}
	}

	return 0;
}