Cod sursa(job #1416281)

Utilizator diac_paulPaul Diac diac_paul Data 7 aprilie 2015 20:06:56
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.01 kb
/*
folosind union-find
*/

#include <stdio.h>
#define NMax 100001
FILE *fin = fopen("disjoint.in", "rt");
FILE *fout = fopen("disjoint.out", "wt");

int n, m;
int p[NMax];

// per total : O(M * N)

int v[NMax], k;
int stramos(int i) {
	k = 0;
	while (p[i] != i) {
		v[k++] = i;
		i = p[i];
	}
	for (int j = 0; j < k; j++) {
		p[v[j]] = i;
	}
	return i;
}

// O(N)
void update(int x, int y) {
	p[stramos(y)] = stramos(x);
}

// O(1) amortizat
int query(int x, int y) {
	return (stramos(x) == stramos(y));
}

int main() {

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

	for (int i = 1; i <= n; i++) {
		p[i] = i;
	}

	int t, x, y;
	while (m--) {
		fscanf(fin, "%d %d %d", &t, &x, &y);
		if (t == 1) {
			// update: reunesc multimile nodurilor x si y
			update(x, y);
		} else {
			// query: vreau sa stiu daca x si y sunt in aceeasi multime
			if (query(x, y) == 1) {
				fprintf(fout, "DA\n");
			} else {
				fprintf(fout, "NU\n");
			}
		}
	}

	fclose(fin);
	fclose(fout);
	return 0;
}