Cod sursa(job #1922398)

Utilizator Firealex2Rotileanu Alexandru Firealex2 Data 10 martie 2017 17:18:30
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.84 kb
#include <fstream>
#include <string>
#include <vector>
#include <algorithm>

using namespace std;

ifstream fi("disjoint.in");
ofstream fo("disjoint.out");

#define maxn 100020

int TT[maxn + 1], RG[maxn + 1];
int N, M;

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


int main()
{
	fi >> N >> M;
	for (int i = 1;i <= N;i++)
		TT[i] = i, RG[i] = 1;
	for (int i = 1;i <= M;i++)
	{
		int x, y, cd;
		fi >> cd >> x >> y;
		if (cd == 2)
		{
			if (find(x) == find(y)) fo << "DA\n";
			else fo << "NU\n";
		}
		else unite(find(x), find(y));
	}
	return 0;
}

int find(int x)
{
	int R, y;
	for (R = x; TT[R] != R; R = TT[R]);
	while (TT[x] != x)
	{
		y = TT[x];
		TT[x] = R;
		x = y;
	}
	return R;
}

void unite(int x, int y)
{
	if (RG[x] > RG[y])
		TT[y] = x;
	else TT[x] = y;

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