Cod sursa(job #1705102)

Utilizator kittDenisa kitt Data 19 mai 2016 22:15:51
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.92 kb
#include <stdio.h>
#include <stack>
#include <vector>
#include <algorithm>

#define NMAX 100001

using namespace std;

int parent[NMAX], rang[NMAX];
int n, m;

int findSet(int x) {
	int i = x;
	while(parent[i] != i) {
		i = parent[i];
	}
	int j = x, aux;
	while (parent[j] != j) {
		aux = parent[j];
		parent[j] = i;
		j = aux;
	}
	return i;
}

void unite(int x, int y) {
	if (rang[x] > rang[y]) {
		parent[y] = x;
	} else {
		parent[x] = y;
	}

	if (rang[x] == rang[y]) {
		++ rang[y];
	}
}

int main() {
	FILE *in, *out;
	in = fopen("disjoint.in", "r");
	out = fopen("disjoint.out", "w");
	int type, x, y;
	fscanf(in, "%d%d", &n, &m);
	for (int i = 1; i <= n; ++i) {
		parent[i] = i;
	}
	for (int i = 1; i <= m; ++i) {
		fscanf(in, "%d%d%d", &type, &x, &y);
		if (type == 1) {
			unite(findSet(x), findSet(y));
		} else {
			if (findSet(x) == findSet(y)) {
				fprintf(out, "DA\n");
			} else {
				fprintf(out, "NU\n");
			}
		}

	}
}