Cod sursa(job #2000398)

Utilizator contnouAndrei Pavel contnou Data 13 iulie 2017 15:50:05
Problema Paduri de multimi disjuncte Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.3 kb
#include <fstream>
#include <iostream>
#define MAXSZ 100005

using namespace std;

ifstream f("disjoint.in");
ofstream g("disjoint.out");

int findSet(int x, int T[]) {
	//
	if (T[x] == x) return T[x];

	T[x] = findSet(T[x], T);	
	return T[x];
}

void join(int x, int y, int T[], int size[]) {
	//
	int set1 = findSet(x, T);
	int set2 = findSet(y, T);
	// cout << set1 << " " << set2 << endl;
	if (set1 != set2) {
		if (size[set1] < size[set2]) {
			T[set1] = set2;
		}
		else {
			T[set2] = set1;

		}
		int aux = size[set1];
		size[set1] += size[set2];
		size[set2] += aux;
	}
}

bool checkSameSet(int x, int y, int T[]) {
	//
	cout << "Check same set " << x << " " << y << endl;
	int set1 = findSet(x, T);
	cout << "Check same set " << x << " " << y << endl;
	int set2 = findSet(y, T);
	return (set1 == set2);
}

void init(int T[], int size[], int n) {
	//
	for (int i = 1; i <= n; i++) {
		T[i] = i;
		size[i] = 1;
	}
}
int main() {
	//
	int n, T[MAXSZ], m;
	int size[MAXSZ];
	f >> n >> m;
	init(T, size, n);
	for (int i = 1; i <= m; i++) {
		//
		int op, x, y;
		f >> op >> x >> y;
		switch (op) {
			case 1:
				join(x, y, T, size);
				break;
			case 2:
				bool same = checkSameSet(x, y, T);
				g << (same ? "DA" : "NU") << endl;
				break;
		}
	}
}