Cod sursa(job #2073188)

Utilizator pelokbence575Pelok Benedek pelokbence575 Data 22 noiembrie 2017 19:46:01
Problema Paduri de multimi disjuncte Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.15 kb
#include <iostream>
#include <fstream>
#include <string>

#define NMAX 100003

int points[NMAX];
int lengths[NMAX];

using namespace std;

int rooter(int target) {
	int root = target;
	while (root != points[root]) {
		points[root] = points[points[root]];
		root = points[root];
	}
	return root;
}

void unite(int point1, int point2) {
	int root1 = rooter(point1);
	int root2 = rooter(point2);

	if (root1 != root2) {
		if (lengths[root1] > lengths[root2]) {
			points[root2] = root1;
			lengths[root1] += lengths[root2];
		}
		else {
			points[root1] = root2;
			lengths[root2] += lengths[root1];
		}
	}
}

int main() {
	ifstream input("disjoint.in");
	ofstream output("disjoint.out");

	int n, m;

	input >> n >> m;

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

	int order, from, to;

	for (int i = 0; i < m; ++i) {
		input >> order >> from >> to;
		if (order == 1) {
			unite(rooter(from), rooter(to));
		}
		else {
			if (rooter(from) == rooter(to)) {
				output << "DA" << endl;
			}
			else {
				output << "NU" << endl;
			}
		}
	}
	input.close();
	output.close();
	return 0;
}