Cod sursa(job #1764428)

Utilizator delia_ioanaCeapa Delia Ioana delia_ioana Data 25 septembrie 2016 15:23:52
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.1 kb
#include <stdio.h>
#include <iostream>
#include <vector>

using namespace std;

int n, m, op, x, y;
vector<int> parent(100001), rang(100001);

int find(int x) {
	int sol = x, aux;

	while (sol != parent[sol])                    // gasirea capului
		sol = parent[sol];

	while (x != parent[x]) {
		aux = parent[x];                          // compresia drumurilor
		parent[x] = sol;
		x = aux;
	}

	return sol;
}

void unite(int x, int y) {
	if (rang[x] > rang[y])
		parent[y] = x;
		else parent[x] = y;                         // unesc multimea de rang mai mic cu cea de rang mai mare

	if (rang[x] == rang[y])
		rang[y] ++;
}
                                                     // https://www.youtube.com/watch?v=ID00PMy0-vE
int main() {
	freopen("disjoint.in", "r", stdin);
	freopen("disjoint.out", "w", stdout);

	scanf("%d %d", &n, &m);

	for (int i = 1; i <= n; i ++) {
		parent[i] = i;
		rang[i] = 0;
	}

	for (int i = 1; i <= m; i ++) {
		scanf("%d %d %d", &op, &x, &y);
		if (op == 1)
			unite(find(x), find(y));
			else {
				if (find(x) == find(y))
					printf("DA\n");
					else printf("NU\n");
			}
	}

	return 0;
}