Cod sursa(job #2721154)

Utilizator FrostfireMagirescu Tudor Frostfire Data 11 martie 2021 16:42:08
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.86 kb
#include <iostream>
#include <fstream>
#define NMAX 100000

using namespace std;

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

int n, m, tata[NMAX+10], rang[NMAX+10];

int findDaddy(int x)
{	int r = x, y = x;
	while(r != tata[r])
		r = tata[r];
	while(x != tata[x])
		{	y = tata[x];
			tata[x] = r;
			x = y;
		}
	return r;
}

void unite(int x, int y)
{	if(rang[x] < rang[y])
		tata[x] = y;
	else
		tata[y] = x;
	if(rang[x] == rang[y])
		rang[x]++;
}

int main()
{
	fin >> n >> m;
	for(int i=1; i<=n; i++)
		{	tata[i] = i;
			rang[i] = 1;
		}
	for(int i=1; i<=m; i++)
		{	int type, x, y;
			fin >> type >> x >> y;
			int val1 = findDaddy(x), val2 = findDaddy(y);
			if(type == 1)
				unite(val1, val2);
			else
				{	if(val1 == val2) fout << "DA" << '\n';
					else fout << "NU" << '\n';
				}
		}
	return 0;
}