Cod sursa(job #369272)

Utilizator iulia609fara nume iulia609 Data 27 noiembrie 2009 19:05:53
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.06 kb
#include<stdio.h>
using namespace std;

#define NMAX 100005

int N, M;
int parent[NMAX], rank[NMAX];
int x, y, xRoot, yRoot;

void MakeSet(int x)
{
	parent[x] = x;
	rank[x] = 1;
}

int Find(int x)
{
	if(parent[x] == x) 
		return x;
	else
	{
		parent[x] = Find(parent[x]);
		return parent[x];
	}
}

void Union(int x, int y)
{
	xRoot = Find(x);
	yRoot = Find(y);
	
	if(rank[xRoot] > rank[yRoot])
		parent[yRoot] = xRoot;
	
	  else if(rank[xRoot] < rank[yRoot])
		  parent[xRoot] = yRoot;
	 
	   else if(xRoot != yRoot)
		   {
			   parent[xRoot] = yRoot;
			   rank[xRoot]++;
		   }
}


int main()
{ int i, type, in, sf;

	freopen("disjoint.in", "r", stdin);
	freopen("disjoint.out", "w", stdout);
	
	scanf("%d %d", &N, &M);
	
	for(i = 1; i <= N; i++)
		{MakeSet(i);}
	
	for(i = 1; i <= M; i++)
	{
		scanf("%d %d %d", &type, &in, &sf);
	
		if(type == 1)
			Union(in, sf);
		
		else //if(type == 2)
		  {
			  if(Find(in) == Find(sf))
				  printf("DA\n");
			    else printf("NU\n");
		  }
		
	}
	
	return 0;
}