Cod sursa(job #827143)

Utilizator lucian666Vasilut Lucian lucian666 Data 1 decembrie 2012 17:44:14
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.82 kb



//Vasilut
#include<fstream>
#define NN 100010

using namespace std;
ofstream out("disjoint.out");

int T[NN],rang[NN],n,m;

void read();
int find(int x); //gasesc radacina
void unite(int x,int y); //unesc multimile cu radacinile x,y

int main()
{
	ifstream in("disjoint.in");
	in>>n>>m;
	for(int i=1;i<=n;i++)
	{
		T[i]=i;
		rang[i]=1;
	}
	for( int cod,x,y ; m ; --m )
	{
		in>>cod>>x>>y;
		int m1 = find(x);
		int m2 = find(y);
		if ( cod == 1 )
			unite(m1,m2);
		else
		{
			if  ( m1 == m2 )
				out<<"DA"<<'\n';
			else
				out<<"NU"<<'\n';
		}
	}
	return 0;
}

int find(int x)
{
	if ( x != T[x] )
	return	T[x] = find( T[x] );
	return x;
}

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