Cod sursa(job #2528053)

Utilizator xXoctavianXxStanescu Matei Octavian xXoctavianXx Data 21 ianuarie 2020 13:31:00
Problema Paduri de multimi disjuncte Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.01 kb
#include <iostream>
#include <fstream>

using namespace std;

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

int len[100009],rad[100009];
int n;

void uneste(int a,int b)
{
	int a2 = a;
	int b2 = b;
	while(a2 != rad[a2])
		a2 = rad[a2];
		
	while(b2 != rad[b2])
		b2 = rad[b2];
	if(len[a2]<len[b2])
	{
		swap(a,b);
		swap(a2,b2);
	}
	rad[b2]=a2;
	len[a2]+=len[b2];
	while(a!=a2)
	{
		int aux=rad[a];
		rad[a]=a2;
		a=aux;
	}
	while(b!=a2)
		{
			int aux=rad[b];
			rad[b]=a2;
			b=aux;
		}
}

void cauta(int a, int b)
{
	int a2=a;
	int b2=b;
	while(rad[b2]!=b2)
	{
		b2=rad[b2];
	}
	while(rad[a2]!=a2)
	{
		a2=rad[a2];
	}
	if(a2==b2) fout<<"DA"<<"\n";
	else fout<<"NU"<<"\n";
	while(a!=a2)
	{
		int aux=rad[a];
		rad[a]=a2;
		a=aux;
	}
	while(b!=b2)
	{
		int aux=rad[b];
		rad[b]=b2;
		b=aux;
		}
}

int main()
{
	int m;
	fin>>n>>m;
	for(int i=1; i<=n; i++) rad[i]=i;
	for(int i=1; i<=n; i++) len[i]=1;
	while(m--)
	{
		int op,x,y;
		fin>>op>>x>>y;
		if(op==1)
		{
			uneste(x,y);
		}
		if(op==2)
		{
			cauta(x,y);
		}
	}
}