Cod sursa(job #1371401)

Utilizator MarronMarron Marron Data 3 martie 2015 21:17:27
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1 kb
#include <iostream>
#include <fstream>


const int MAXN = 100005;
std::ifstream f("disjoint.in");
std::ofstream g("disjoint.out");
int parent[MAXN]; int n;
int rang[MAXN];


int find(int x)
{
	int r = x;
	while (r != parent[r]) {
		r = parent[r];
	}

	while (x != parent[x]) {
		int aux = parent[x];
		parent[x] = r;
		x = aux;
	}

	return r;
}


void unite(int x, int y)
{
	x = find(x);
	y = find(y);

	if (rang[x] < rang[y]) {
		parent[x] = y;
	}
	if (rang[y] < rang[x]) {
		parent[y] = x;
	}
	if (rang[x] == rang[y]) {
		parent[x] = y;
		rang[y]++;
	}
}


void query(int x, int y)
{
	if (find(x) == find(y)) {
		g << "DA\n";
	}
	else {
		g << "NU\n";
	}
}


int main()
{
	int m;
	f >> n >> m;
	for (int i = 1; i <= n; i++) {
		parent[i] = i;
		rang[i] = 1;
	}

	for (int i = 1, op, x, y; i <= m; i++) {
		f >> op >> x >> y;

		if (op == 1) unite(x, y);
		if (op == 2) query(x, y);
	}


	//system("pause");
	f.close();
	g.close();
	return 0;
}