Cod sursa(job #2636100)

Utilizator irimia_alexIrimia Alex irimia_alex Data 16 iulie 2020 16:52:24
Problema Paduri de multimi disjuncte Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.87 kb
#include <stdio.h>
#define NMAX 100005

FILE* fin, * fout;

int M[NMAX], n, m;

void compresie(int x, int r) {
	while (x != r) {
		int urm = M[x];
		M[x] = r;
		x = urm;
	}
}

int radacina(int x) {
	int y = x;
	while (M[x] != x)
		x = M[x];

	compresie(y, x);

	return x;
}

void reuniune(int x, int y) {
	int r1 = radacina(x), r2 = radacina(y);
	M[r1] = r2;
}

bool aceeasiMultime(int x, int y) {
	int r1 = radacina(x), r2 = radacina(y);

	return (r1 == r2);
}

int main() {
	fin = fopen("disjoint.in", "r");
	fout = fopen("disjoint.out", "w");

	fscanf(fin, "%i %i", &n, &m);

	for (int i = 1;i <= n;++i)
		M[i] = i;

	while (m--) {
		int t, x, y;
		fscanf(fin, "%i %i %i", &t, &x, &y);
		if (t == 1) {
			reuniune(x, y);
		}
		else {
			if (aceeasiMultime(x, y))
				printf("DA\n");
			else printf("NU\n");
		}
	}

	return 0;
}