Cod sursa(job #1453418)

Utilizator pas.andreiPopovici Andrei-Sorin pas.andrei Data 23 iunie 2015 14:48:25
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.22 kb
#include <iostream>
#include <fstream>
#include <cstring>
#include <algorithm>
#include <string>
#include <cstdlib>
#include <cstdio>
#include <cmath>
#include <vector>
#include <set>
#include <map>
#include <iterator>
#include <queue>
#include <functional>
#include <utility>
#define FOR(start,end) for(int i = start; i<end; ++i)
#define MAX 252

using namespace std;

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

int findSet(int i);
bool inSameSet(int i, int j);
void unionSet(int i, int j);

int p[100001], Rank[100001];

int main() {
	int n, i, j, t, op, m;
	
	fin >> n >> m;

	for (i = 1; i <= n; ++i) {
		p[i] = i;
		Rank[i] = 1;
	}

	for (t = 0; t < m; ++t) {
		fin >> op >> i >> j;

		if (op == 1)
			unionSet(i, j);
		else {
			if (inSameSet(i, j))
				fout << "DA\n";
			else
				fout << "NU\n";
		}
	}

	return 0;
}

int findSet(int i) {
	if (p[i] == i)
		return i;

	return p[i] = findSet(p[i]);
}

bool inSameSet(int i, int j) {
	return findSet(i) == findSet(j);
}

void unionSet(int i, int j) {
	int x = findSet(i);
	int y = findSet(j);
	
	if (Rank[x] > Rank[y])
		p[y] = x;
	else {
		p[x] = y;

		if (Rank[x] == Rank[y])
			++Rank[y];
	}
}