Cod sursa(job #2571689)

Utilizator alex2209alexPavel Alexandru alex2209alex Data 5 martie 2020 09:33:07
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.44 kb
#include <fstream>
 
using namespace std;
ifstream f("disjoint.in");
ofstream g("disjoint.out");
//------------------------------
//Variabile globale
int grad[100001],v[100001];
//------------------------------
//Functii
void citire();
void uneste();
void cauta(int,int);
//------------------------------
int main()
{
	citire();
	return 0;
}
//------------------------------
void cauta(int a,int b)
{
	int a2 = a;
	while(v[a2] != a2)
		a2 = v[a2];
	int b2 = b;
	while(v[b2] != b2)
		b2 = v[b2];
	if(a2 == b2)
	{
		g << "DA" << '\n';
		while(a != a2)
		{
			int a3 = a;
			a = v[a];
			v[a3] = a2;
		}
		while(b != a2)
		{
			int b3 = b;
			b = v[b];
			v[b3] = a2;
		}
	}
	else
    {
        g << "NU" << '\n';
        while(a != a2)
		{
			int a3 = a;
			a = v[a];
			v[a3] = a2;
		}
		while(b != b2)
		{
			int b3 = b;
			b = v[b];
			v[b3] = b2;
		}
    }
}
//------------------------------
void uneste(int a,int b)
{
	int a2 = a;
	while(v[a2] != a2)
		a2 = v[a2];
	int b2 = b;
	while(v[b2] != b2)
		b2 = v[b2];
	if(grad[a2] < grad[b2])
	{
		swap(a2,b2);
		swap(a,b);
	}
	grad[a2] += grad[b2];
	while(a != a2)
	{
		int a3 = a;
		a = v[a];
		v[a3] = a2;
	}
	while(b != b2)
	{
		int b3 = b;
		b = v[b];
		v[b3] = a2;
	}
	v[b2]=a2;
}
//------------------------------
void citire()
{
	int n,m;
	f >> n >> m;
	for(int i = 1; i <= n; ++i)
	{
		v[i] = i;
		grad[i] = 1;
	}
	while(m--)
	{
		int c,a,b;
		f >> c >> a >> b;
		if(c == 1)
			uneste(a,b);
		else cauta(a,b);
	}
}