Cod sursa(job #2073208)

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

#define NMAX 100003

using namespace std;

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

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

int rooter(int target) {
	int root = target, temp;
	while (root != points[root]) {
		//points[root] = points[points[root]];
		root = points[root];
	}
	while (points[root] != root) {
		temp = points[target];
		points[target] = root;
		target = temp;
	}
	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;
		}
		else {
			points[root1] = root2;
		}
		if (lengths[root1] == lengths[root2]) {
			lengths[root2]++;
		}
	}
}

int main() {

	int i, n, m;

	input >> n >> m;

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

	int order, from, to;

	for (i = 0; i < m; ++i) {
		input >> order >> from >> to;

		//lengths[points[i]]++;

		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;
}