Cod sursa(job #2948533)

Utilizator RaduAntoneoAntonio Alexandru Radu RaduAntoneo Data 27 noiembrie 2022 20:21:38
Problema Paduri de multimi disjuncte Scor 10
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.96 kb
#include <bits/stdc++.h>
using namespace std;

ifstream f("disjoint.in");
ofstream g("disjoint.out");
#define cin f
#define cout g

vector<int> size;
vector<int> parent;

int find(int node) {
	int boss = node;
	while (boss != parent[boss])
		boss = parent[boss];

	while (node != boss) {
		int aux = parent[node];
		parent[node] = boss;
		node = aux;
	}

	return boss;
}

void unite(int u, int v) {
	int parent_u = find(u);
	int parent_v = find(v);

	if (parent_u == parent_v)
		return;

	if (size[u] > size[v]) {
		parent[v] = u;
		size[u] += size[v];
	} else {
		parent[u] = v;
		size[v] += size[u];
	}
}

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

	size.resize(n+1, 1);
	parent.resize(n+1);
	for (int i = 1; i <= n; i++)
		parent[i] = i;

	for (int i = 0; i < m; i++) {
		int query, u, v;
		cin >> query >> u >> v;

		if (query == 1) 
			unite(u, v);
		else 
			cout << (find(u) == find(v) ? "DA\n" : "NU\n");
	}

	return 0;
}