Cod sursa(job #2073524)

Utilizator Kzsolty96SAPIENTIA OSZTIAN DANIEL KUCSVAN Kzsolty96 Data 23 noiembrie 2017 11:51:14
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.19 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;
	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() {

	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;

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

		if (order == 1) {
			//unite(rooter(from), rooter(to));
			unite(from, to);
		}
		else {
			if (rooter(from) == rooter(to)) {
				output << "DA\n";
			}
			else {
				output << "NU\n";
			}
		}
	}
	input.close();
	output.close();
	return 0;
}