Cod sursa(job #2449522)

Utilizator r00t_Roman Remus r00t_ Data 19 august 2019 23:15:32
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.97 kb
#include <iostream>
#include <vector>
#include <fstream>
#include <cmath>
#include <cstdlib>

using namespace std;

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

int padure[100100];
int conexSz[100100];

int parent(int k)
{
	int aux = k;
	int sz = 0;
	while (padure[k] != k)
	{
		k = padure[k];
		sz++;
	}
	conexSz[k] = sz;
	int it = padure[aux];
	padure[aux] = k;
	while (padure[it] != it)
	{
		padure[aux] = k;
		aux = it;
		it = padure[it];
	}

	return k;
}

void connect(int a, int b)
{
	int pa = parent(a), pb = parent(b);
	if (conexSz[pa] <= conexSz[pb])
		padure[pa] = pb;
	else
		padure[pb] = pa;
}

int main()
{
	int n, m;
	fin >> n >> m;
	for (int i = 1; i <= n; i++) padure[i] = i, conexSz[i] = 1;
	
	for (int i = 0; i < m; i++)
	{
		int t, a, b;
		fin >> t >> a >> b;
		if (t == 1)
		{
			connect(a, b);
		}
		else
			if (parent(a) == parent(b))
				fout << "DA\n";
			else fout << "NU\n";

	}
	

}