Mai intai trebuie sa te autentifici.

Cod sursa(job #2397158)

Utilizator andrei828Ungureanu Andrei-Liviu andrei828 Data 4 aprilie 2019 11:14:27
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.18 kb
#include <fstream>
#include <vector>

std::ifstream fin("disjoint.in", std::ifstream::in);
std::ofstream fout("disjoint.out", std::ofstream::out);

void _union(std::vector<int>& comp, std::vector< std::vector<int> >& subset, int x, int y) {
	size_t comp_x = comp[x], comp_y = comp[y];

	if (subset[comp[x]].size() <= subset[comp[y]].size()) {
		size_t size1 = subset[comp_x].size();
		for (int i = 0; i < size1; i++) {
			subset[comp_y].push_back(subset[comp_x][i]);
			comp[subset[comp_x][i]] = comp_y;
		}
		subset[comp_x].clear();
	} else {
		size_t size2 = subset[comp_y].size();
		for (int i = 0; i < size2; i++) {
			subset[comp_x].push_back(subset[comp_y][i]);
			comp[subset[comp_y][i]] = comp_x;
		}
		subset[comp_y].clear();
	}
}

void _check(std::vector<int>& comp, int x, int y) {
	if (comp[x] == comp[y])
		fout << "DA\n";
	else
		fout << "NU\n";
}

int main() {
	int n, m, cod, x, y;
	fin >> n >> m;
	std::vector<int>comp(n + 1);
	std::vector< std::vector<int> >subset(n + 1);

	for (int i = 1; i <= n; i++) {
		comp[i] = i;
		subset[i].push_back(i);
	}

	for (int i = 0; i < m; i++) {
		fin >> cod >> x >> y;
		if (cod == 1) 
			_union(comp, subset, x, y);
		else
			_check(comp, x, y);
	}
}