Cod sursa(job #2654968)

Utilizator akumariaPatrascanu Andra-Maria akumaria Data 2 octombrie 2020 23:12:00
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.01 kb
#include <cstdio>
#include <vector>

using namespace std;

vector<int> parents;
vector<int> ranks;

void join(int a, int b) {
	if (ranks[a] > ranks[b])
		parents[b] = a;
	else
		parents[a] = b;

	if (ranks[a] == ranks[b])
		++ranks[b];
}


int get(int a) {
	int i, aux;
	for(i=a; parents[i] != i; i = parents[i]);

	while(parents[a] != a) {
		aux = parents[a];
		parents[a] = i;
		a = aux;
	}

	return i;
}



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


int main() {
	freopen("disjoint.in", "r", stdin);
	freopen("disjoint.out", "w", stdout);

	int n, m, a, b, c;

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

	parents.resize(n+1);
	ranks.resize(n+1);
	for(int i=1; i<=n; ++i) {
		ranks[i] = 1;
		parents[i] = i;
	}

	for(int i=0; i<m; ++i) {
		scanf("%d%d%d", &a, &b, &c);
		if (a == 1)
            if (! common(b, c))
                join(get(b), get(c));
            else;
		else
			if (common(b, c))
				printf("DA\n");
			else
				printf("NU\n");
	}

	return 0;
}