Cod sursa(job #936901)

Utilizator forgetHow Si Yu forget Data 9 aprilie 2013 01:07:41
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.7 kb
#include <fstream>
#include <vector>
using namespace std;

vector<int> parent;
vector<int> rank;

int find(int i)
{
	return (parent[i]? parent[i] = find(parent[i]) : i);
}

void merge(int i, int j)
{
	int root1 = find(i), root2 = find(j);
	if (rank[root1] < rank[root2]) parent[root1] = root2;
	else if (rank[root1] > rank[root2]) parent[root2] = root1;
	else {parent[root2] = root1; ++rank[root1];}
}

int main() {
	ifstream fin("disjoint.in");
	ofstream fout("disjoint.out");
	int n, m;
	fin >> n >> m;
	parent.resize(n+1);
	rank.resize(n+1);
	int q, a, b;
	for (; m > 0; --m) {
		fin >> q >> a >> b;
		if (q == 1) merge(a,b);
		else if (find(a) == find(b)) fout << "DA\n";
		else fout << "NU\n";
	}
	return 0;
}