Cod sursa(job #926040)

Utilizator vld7Campeanu Vlad vld7 Data 24 martie 2013 21:57:35
Problema Paduri de multimi disjuncte Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 0.79 kb
#include <fstream>

using namespace std;

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

const int MAX_N = 100005;

int n, m, tata[MAX_N], rang[MAX_N];

void unite(int x, int y) {
	if (rang[x] < rang[y])
		tata[x] = y;
	else
		tata[y] = x;
	
	if (rang[x] == rang[y])
		rang[x]++;
}

int find(int x) {
	int R;
	
	for (R = x; R != tata[R]; R = tata[R]);
	
	for (int y = x; y != R; y = tata[y]) {
		tata[y] = R;
	}
}

int main() {
	f >> n >> m;
	
	for (int i = 1; i <= n; i++) {
		tata[i] = i;
		rang[i] = 1;
	}
	
	for (int i = 1; i <= m; i++) {
		int op, x, y;
		
		f >> op >> x >> y;
		if (op == 1)
			unite(x, y);
		else {
			if (find(x) == find(y))
				g << "DA\n";
			else
				g << "NU\n";
		}
	}
	
	f.close();
	g.close();
	
	return 0;
}