Cod sursa(job #1747835)

Utilizator octav1234Pocola Tudor Octavian octav1234 Data 25 august 2016 17:37:39
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.86 kb
#include<fstream>
using namespace std;
ifstream fi("disjoint.in");
ofstream fo("disjoint.out");

int P[100005];
int NR[100005];
int M,N;

int tip,x,y;


int radacina(int a)
{
	if(P[a]==a)
		return a;
	return radacina(P[a]);
}

void reuniune(int des,int cel)
{
	P[cel]=des;
	NR[des]+=NR[cel];
}

void actualizare(int a, int b)
{
	int ra,rb;
	ra=radacina(a);
	rb=radacina(b);
	
	if(NR[ra]<NR[rb])
		reuniune(rb,ra);
	else
		reuniune(ra,rb);
	
}

bool prieteni(int a, int b)
{
	if(radacina(a)==radacina(b))
		return true;
	return false;
}
int main()
{
	fi>>N>>M;
	
	for(int i=1;i<=N;i++)
	{
		P[i]=i;
		NR[i]=1;
	}
	for(int i=1;i<=M;i++)
	{
		fi>>tip>>x>>y;
		if(tip==1)
			actualizare(x,y);
		else
		{
			if(prieteni(x,y))
				fo<<"DA\n";
			else
				fo<<"NU\n";
		}
	}
	fi.close();
	fo.close();
	return 0;
}