Cod sursa(job #1138940)

Utilizator sorin2kSorin Nutu sorin2k Data 10 martie 2014 19:00:18
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.94 kb
#include<fstream>
using namespace std;

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

int val[100001], size[100001];

void init(int n) {
	for(int i = 1; i <= n; i++) {
		val[i] = i;
		size[i] = 1;
	}
}

int parent(int u) {
	int u2 = u, aux;
	while(u != val[u]) u = val[u];
	while(u2 != u) {
		aux = val[u2];
		val[u2] = u;
		u2 = aux;
	}
	return u;
}

void union_elements(int u, int v) {
	int pu, pv;
	pu = parent(u);
	pv = parent(v);
	if(size[pu] < size[pv]) val[pu] = pv;
	if(size[pu] > size[pv]) val[pv] = pu;
	if(size[pu] == size[pv]) {
		val[pu] = pv;
		size[pu]++;
	}
}

bool find_elements(int u, int v) {
	return parent(u) == parent(v);
}

int main() {
	int n, m, i, t, a, b;
	fin >> n >> m;
	init(n);
	for(i = 0; i < m; i++) {
		fin >> t >> a >> b;
		if(t == 1) union_elements(a, b);
		else {
			if(find_elements(a, b) == true) fout << "DA\n";
			else fout << "NU\n";
		}
	}
	return 0;
}