Cod sursa(job #850702)

Utilizator krissu93FMI Tiugan Cristiana Elena krissu93 Data 8 ianuarie 2013 20:18:35
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.87 kb
#include <fstream>
#define nmax 100003

using namespace std;

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

int arb[nmax];
int rang[nmax];

int find(int x){
	int i,y;
	for (i=x;arb[i]!=i;i=arb[i]);
	//mergi pana gasesti un nod care pointeaza catre el ;
	for (;arb[x]!=x;)
	{
		y=arb[x];
		arb[x]=i;
		x=y;
	}
	return i;
}
void unite( int x, int y){
	if (rang[x]<rang[y]) arb[x]=y;
	else arb[y]=x;
	if (rang[x]==rang[y]) ++rang[x];
}
int main()
{	int n,m;
	in>>n>>m;
	for (int i=1;i<=n;i++)
	{
		rang[i]=1;//rangul fiecarui arbore initial este 1
		arb[i]=i;//radacina fiecarui arbore este elementul insusi
	}
	for (int i=1;i<=m;i++)
	{
		int op,a,b;
		in>>op>>a>>b;
		if (op==1){
			unite(find(a),find(b));
		}else
		{
		if (op==2) 
		{
			if (find(a)==find(b)) out<<"DA"<<"\n";
			else out<<"NU"<<"\n";
		}
		}
	}
	return 0;
}